程序计数器
作用:用来存储指向下一条指令的地址。由执行引擎读取下一条指令。
- java虚拟机的多线程是通过线程切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。各条线程之间计数器互不影响,独立存储,这类内存区域为线程私有的内存。
- 程序计数器是唯一一个在java虚拟机规范中没有oom的内存区域,也没有垃圾回收。(虚拟机栈和本地方法栈没有垃圾回收,但是会有内存溢出,方法区和堆既有垃圾回收,也会有内存溢出)
- 是程序控制流的指示器,分之、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成
通过命令查看字节码
javap -v xxx.class
#程序计数器存储的是下一条指令的地址

面试题:
1.使用pc寄存器(程序计数器)存储字节码指令地址有什么作用?
为什么使用pc寄存器记录当前线程的执行地址。
java虚拟机的多线程是通过线程切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。各条线程之间计数器互不影响,独立存储。
2.pc寄存器为什么会被设定成线程私有
多线程是在特定时间端内只会执行其中某一个线程的方法,cpu会不停切换任务,必然会导致线程的经常中断或恢复,为了能够准确的记录各个线程正在执行的当前字节码指令地址,最好的方法就是为每一个线程都分配一个pc寄存器,这样线程间可以进行独立计算,不会相互影响。
网友评论