java虚拟机运行时数据区

java虚拟机运行时区域

程序计数器

程序计数器是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。该计数器线程切换时相互不影响,所以这类区域为”线程私有“内存。如果线程执行的是一个java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是一个native方法,这个计数器则为空(Undefined)。此区域是唯一一个在java虚拟机规范中没有规定OutOfMemoryError情况的区域。

虚拟机栈

Java虚拟机栈是线程私有的,它的生命周期与线程相同。此虚拟机栈描述的Java方法执行的内存模型:每个方法在执行的同时创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法调用出口等。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出站的过程。当线程请求的栈深度大于虚拟机栈允许的深度,会抛出StackOverflowError。当无法申请到内存时会抛出OutOfMemoryError异常。

本地方法栈

本地方法栈与虚拟栈所发挥的作用是非常相似的,它们之间区别是虚拟机栈为java方法服务,而本地方法栈为native方法服务。

堆是被所有线程共享的区域,在虚拟机启动时创建。对于大多数应用来说,java堆是java虚拟机锁管理的内存中最大的一块。此内存唯一的目的就是存放对象实例,几乎所有的对象实例都在这里分配。堆是垃圾收集器管理的主要区域,因此很多时候也称为”GC堆”。堆可以处于不连续的内存空间中,只要逻辑连续即可。主流的虚拟机都可以可扩展的.(通过-Xmx 和-Xms控制)。

方法区(非堆)

方法区也是线程共享的区域,是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类信息,常量、静态常量、即时编译后的代码数据。

运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等还有一想信息是常量池。用于存放编译器生成的字面量和符号引用这部分内容将在类加载后进入方法区的运行时常量池。