线程共享区:java堆 方法区
线程私有区:虚拟机栈本地方法栈 程序计数器
程序计数器
一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支,跳转,循环基础功能都要依赖它来实现,每条线程都有一个独立的程序计数器,各线程的计数器互不影响,因此该区域的线程私有的。
当线程在执行一个java方法时,该计数器记录的是正在执行的虚拟机字节码指令的地址,当线程在执行的是Native方法(调用本地操作系统方法)时,该计数器的值为空,另外,该内存区域是唯一一个在java虚拟机规范中没有规定任何的OOM(OoutMEmoryERRor)情况的区域。
Java虚拟机栈
该区域也是私有的,它的生命周期也与线程相同,虚拟机描述的是java方法执行的内存模型,每个方法被执行的时候都会被同时创建一个栈帧,栈是用于虚拟机进行方法调用和方法执行的数据结构,对于执行引擎来讲,活动线程中,只有栈顶的栈桢是有效的,称之为当前栈桢,这个栈桢所关联的方法为当前方法,执行引擎所运行的所有字节码指令都只针对前的栈桢进行操作,栈桢用于存储局部变量表,操作数栈,动态链接,方法返回地址和一些额外的附加信息,在编译程序代码时,栈桢需要多大的存储变量表,多深的操作数栈都已经完全的确定了,并且已经写入方法表的code属性之中,因此,一个栈桢需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
如果线程的请求栈深度大雨虚拟机所允许的深度,将抛出 StackOVERflowERRor异常。
如果虚拟机在动态扩展时无法申请到做够的内存空间,则抛出OOM.
本地方法栈
该区域与虚拟机栈发挥的作用相似,只是虚拟机栈为虚拟机执行java方法服务,而本地方法栈是为操作系统(Native)方法服务。
Java 堆
Java Heap 是java虚拟机所管理的内存中最大的一块,它是所有线程共享的一块区域,几乎所有的对象实例和数组都在这个区域,java heap是垃圾回收期管理的主要区域,也被称之为”GC堆”。
无法扩展时
方法区
方法区也是线程共享区,它用于存储已经被虚拟机加载的类信息,常量,静态变量