Java内存模型包括:
堆、方法区、栈、本地方法栈、程序计数器
其中:堆和方法区是所有线程共享的内存区域,栈、本地方法栈和程序计数器是各个线程私有的内存区域
1、堆
是所有内存中最大的一块,
负责存储几乎所有的对象实例,
是java垃圾收集器管理的主要区域,
在物理上可以是不连续的内存空间,
如果内存分配完成,将会抛出OutOfMemoryError异常,
可细分为新生代(包括:Eden区、From Survivor区、To Survivor区)和老年代
2、方法区
也叫“永久代”或“持久代(PermGen)”,用于存储类信息、常量、静态变量、编译后的代码数据,
可能出现垃圾回收,单比较少出现,回收的目标为:常量池和类的卸载
如果没有内存分配时,将跑出OutOfMemoryError异常
3、栈
每个方法被执行会同事创建一个栈帧,
用于存放局部变量表、操作栈、动态链接、方法出口等信息,
可能抛出两种异常(1)StackOverflowError: 调用的方法深度太深 (2)OutOfMemoryError: 无法申请到足够内存时
4、本地方法栈
可能抛出两种异常(1)StackOverflowError: 调用的方法深度太深 (2)OutOfMemoryError: 无法申请到足够内存时
5、程序计数器
是线程私有的一块较小内存空间,
分支、循环、跳转、异常处理、线程恢复等需要依赖程序计数器来完成,
如果执行的是java方法,则记录的是正在执行的字节码指令的地址,
如果执行的是Native方法,则计数器的值为空(Undefined)
该内存区域是唯一一个不会报OutOfMemoryEroor的区域