Jvm 在运行的过程中内存的划分区域
堆(Heap) 、栈(Stack) 、程序计数器(Program Counter Register)、方法区(Method Area)
1.堆
存放目标对象和数组区域
垃圾回收算法主要工作区域
大部分Java虚拟机都会将此区域设置成动态不可扩展的
Java堆可以不是物理上连续的内存空间,只要逻辑上连续即可
堆空间不足会抛出 OutOfMemoryError
2.栈
2.1 虚拟机栈
描述本地方法在运行过程中需要存储的信息
存储变量表 操作栈 动态链接 方法出口
方法调用一次的过程,就是帧栈一次出栈和入栈的过程
编译器存放的数据类型:八种基本数据类型,对象引用,returnAddress类型
StackOverFlowError : 如果线程请求的资源深度大于虚拟机所允许的深度,此区域会抛出异常
OutOfMemoryError: 在虚拟机会动态扩展的情况下,如果申请不到足够的内存,就会抛出OutOfMemoryError(大部分Java虚拟机都会支持动态扩展)
2.2 本地方法栈
本地方法栈只为虚拟机栈使用的Native 方法服务
HotSpot虚拟机直接将此区域和虚拟机栈合并
同虚拟机栈一样,此区域也会抛出StackOverFlow和OutOfMemoryError 异常
3.方法区
各个线程共享的一块区域
存放虚拟机加载的类信息,常量,静态变量,即时编译器编译后的的代码
别名:永久代
对这已区域的回收主要针对:常量池回收和对类型的卸载
此区域也会抛出OutOfMemoryError
运行时常量
4.程序计数器
标记某个线程执行字节码指令行号,记录指令执行到哪了
每个线程都有一个独立的程序计数器
参考资料:《深入Java虚拟机》