java虚拟机定了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动儿创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程的开始和结束而创建和销毁。
灰色的为单独线程私有的,红色的为多个线程共享的。
各个线程:独有包括程序计数器、栈、本地栈 线程间共享:堆、堆外内存(永久代或元空间、代码缓存)
作用:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令
我们首先写一个简单的代码
/**程序计数器 */
public class PCRegisterTest {
public static void main(String[] args) {
int i = 10;
int j = 20;
int k = i + j;
}
}
然后将代码进行编译成字节码文件,我们再次查看 ,发现在字节码的左边有一个行号标识,它其实就是指令地址,用于指向当前执行到哪里。
指令地址不连续的原因:
因为cpu需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪里开始继续执行。
JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令