程序计数器 ( PC寄存器 )
PC寄存器介绍
PC寄存器作用
PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。
PC 寄存器举例说明
新建类
public class PCTest {
public static void main(String[] args) {
int i=10;
int j=20;
int s =i+j;
}
}
在PCTest.class 编译文件目录 使用 javap -v PCTest.class 反编译
public class PCTest {
public static void main(String[] args) {
int i=10;
int j=20;
int s =i+j;
String str="abc";
System.out.println(j);
System.out.println(s);
}
}
编译之后使用 javap -v PCTest.class 反编译
解释说明 ① ③
分析①: 10: ldc #2 String str="abc";
ldc指令 使用常量池中(Constant pool)的#2 查看常量池中的内容
发现又指向 #27 查看#27
查看得知,是我们定义的abc
分析 ②: 14: getstatic #3 System.out.println(j);
查看常量池 #3
再查看 #28 #29
#28 指向了#34 对应的就是 java/lang/System
#29 分别指向了#35 #36
#35 out
#36 Ljava/io/PrintStream;
PC两个常见的问题
使用PC寄存器存储字节码指令地址有什么用呢?
为什么使用PC寄存器记录当前线程的执行地址呢?
因为CPU需要不停的切换各个线程(并发的去执行),这时候切换回来之后,就得知道接着从哪开始继续执行
JVM字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令