当前位置: 正文

JVM运行时数据区

简介 JVM运行时数据区包括:JVM栈(虚拟机栈),堆,方法区,本地方法栈,PC寄存器。大概的划分就是栈和堆,以及一些其他的结构。重点在JVM栈,堆,方法区。JVM规范指出:方法区在逻辑上属于堆,但是实际的具体的JVM中并不属于堆的一部分。 在JVM栈中会发生GC和Error,但是在其他的内存区域中,可能没有GC或者Error。 有些区域的生命周期是跟随着虚拟机的,当虚拟机被关闭时,这部分的内存也被释放出来。有些是跟随线程的,当线程结束时,这部分的内存也被释放出来。 下图展示了哪些区域是线程共享和线程私有的。 线程私有的:PC寄存器,栈,本地方法栈 线程间共享的:堆,堆外内存(永久代或元空间,代码缓存) 每个JVM对应Java的RunTime类的对象,RunTime实例在每个JVM中只有一个。 运行时数据区的结构图解:

admin

PC寄存器(程序计数器) 简介 类似与计算机组成原理中提及的CPU的PC寄存器,但是CPU的PC寄存器是有实际硬件的,但是JVM的PC寄存器没有实际的硬件部分,这个是每个线程私有的。 JVM的PC寄存器只是一块很小很小的内存区域。 作用 PC寄存器用来存储指向下一条指令的地址,也就是即将执行的指令,由执行引擎读取下一条指令,程序的分支,循环,跳转,异常处理,线程恢复等基础功能都需要PC寄存去来完成。 PC寄存器是唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。

常见问题 为什么需要PC寄存器 因为CPU需要不停地切换线程,当切换回来的时候就需要知道该线程从哪里开始继续执行。 如果没有这个机制,那么切换线程应当不容易。有了这个机制之后,只需要读取PC寄存去的指令就知道该执行哪一个指令,实现起来比较容易。 为什么PC寄存器是线程私有的 因为需要准确记录各个线程正在执行的当前的字节码指令,必须是线程私有的,如果不是线程私有的,意味着任意线程可以随意更改任意线程的字节码指令,这会导致程序的错误。

返回顶部