JVM运行时数据区

来源:互联网 发布:网络词pc是什么意思啊 编辑:程序博客网 时间:2024/06/06 08:55

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如下图所示。
JVM数据区域

程序计数器(PC):

用于存储下一条将被执行的指令的地址或是在方法字节码中相对于该方法起始指令的偏移量。字节码解释器工作时就是通过改变这个计数器的值 来选取下一个条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等都需要依赖这个计数器来完成。

每一个线程都拥有它自己的PC寄存器,它是在线程启动时被创建的。程序计数器是“线程私有”的内存区域。

Java栈

每当启动一个新线程,JVM都会为它分配一个Java栈。JVM会对Java栈执行以帧为单位的压栈和出栈。

每当线程调用一个方法时,JVM就会在当前线程的Java栈中压入一个新帧,它使用这个帧来存储参数,局部变量,中间运算结果等数据。当方法
返回后(return或者抛出异常),当前帧就被弹出Java栈然后释放掉。

Java栈上的所有数据都是线程私有的。任何一个线程都不能访问另一个线程的栈数据。

本地方法栈

当线程调用的是本地方法(Native Method)时,JVM会保持Java栈不变,不再在线程的Java栈中压入新的帧,而只是直接调用指定的本地方法。

Java堆

所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例。

Java堆可以处于物理上不连续的内存空间中。

方法区

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

运行时常量池

方法区的一部分。存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放 到方法 区的运行时常量池中。

java虚拟机对class文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载、执行。

0 0
原创粉丝点击