JVM运行时数据区

1程序计数器(Program Counter Register)是一块较小的内存空间,在线程启动时创建,线程私有。可以看做是当前线程所执行的字节码的行号指示器。

如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2虚拟机栈(Stack):线程私有,生命周期与线程相同;虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。

(虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机使用到的Native方法服务,HotSpot虚拟机直接将本地方法栈和虚拟机栈合二为一)

3(Heap):在虚拟机启动时创建,所有线程共享。唯一的目的就是存放对象实例,几乎所有的对象实例及数组都要在堆上分配。(由-Xmx-Xms控制堆大小),如果堆中没有内存完成实例分配,并且无法再扩展将抛出OutOfMemoryErroy异常。

4方法区(Method Area),所有线程共享,用于存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。当方法去无法满足内存分配需求是将抛出OutOfMemoryErroy异常。

原文地址:https://www.cnblogs.com/liangzh/p/2571077.html