在JVM中程序执行的过程中,技术计数器起着控制程序下一步运行那一条指令,起着至关重要的作用,一切来了解了解JVM中的pc寄存器
1. PC Register是什么?
一张图表示PC寄存器在JVM的位置
- 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行字节码的行号指示器;
- JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟;
- 每个线程拥有自己的PC寄存器,生命周期与线程生命周期相同;
- PC存储当前线程正在执行方法的JVM指令地址,若是native方法,则是undefined;
- 是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能需要依赖PC寄存器;
- 是JVM中唯一一个未规定任何OutOfMemoryError情况的区域;
PC主要服务于线程中的虚拟机栈,继续虚拟机栈需要执行代码的行号,示例图如下所示:
2. 例子
上图,显示Java源码编译为.class文件后字节码的显示,PC计数器则记录的是当前执行的字节码行号;
3. 两个常见问题
3.1 PC寄存器存储字节码指令有什么用?
线程的执行时通过占用CPU时间片来执行的,时间片执行完后需让给其他线程,所以CPU需要不停的切换各个线程,切换回来后需要知道从哪里接着开始;
3.2 PC寄存器为什么设置为线程私有?
程序执行过程中,CPU不断切换线程来执行,所以PC计数器应该准确记录各个线程正在执行的当前字节码指令的地址,若共享,会导致程序执行混乱;