本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Java运行时数据区
运行时数据区主要包括 JVM stacks 、PC寄存器(Program Counter Register)、方法区(Method Area)、本地方法栈(Native Method Stacks)、堆(Heap)。 Java 虚拟机定义了在程序执行期间使用的不同的运行时数据区。有些数据区是线程共享,有的则被线程独享。线程独享的数据区跟随线程的创建退出而创建销毁。直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但是这部分内存也被频繁的使用,也可能会导致OOM(OutOfMemoryError)
线程共享的有堆和方法区,每个线程独享pc,虚拟机栈、本地方法栈
PC寄存器
PC:线程私有 先看一下官方文档当中的描述:
PC寄存器用来存储指向下一条指令的地址,也就是将要执行那一条指令。由执行引擎读取系一条指令。
1.是一块很小的内存空间,也是运行最快的存储区域
2.线程私有
3.只会记录当前线程正在执行Java代码的JVM指令地址。如果是native方法,则为空
4.Java虚拟机规范中,这是唯一一块没有OOM的区域。
运行类似于
while(线程运行){
取Pc当中的位置,找到对应的指令;
执行该指令;
pc++;
}
举个例子:现在有线程A,B;线程A运行到一半的时候被B抢占,这时候,pc寄存器就可以记录下A运行到哪,然后在A再次运行的时候就可以从中断的地方开始运行。