运行时数据区是在类加载完成后所经历的阶段,当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,执行引擎就会对类进行使用,这时就用到了运行时数据区。
举例来说,类的加载过程就好像是买菜的过程,经过一系列奔波,从购买到检验,最后再送到厨房(也就是运行时数据区)。而执行引擎就是一名厨师,他会用准备好的蔬菜去进行菜品的制作。
官方文档网址:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令,并执行该指令。
static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=3, locals=0, args_size=0
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: invokestatic #5 // Method java/lang/Thread.currentThread:()Ljava/lang/Thread;
13: invokevirtual #6 // Method java/lang/Thread.getName:()Ljava/lang/String;
16: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: ldc #8 // String 初始化当前类
21: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
27: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: goto 30
LineNumberTable:
line 22: 0
line 23: 30
StackMapTable: number_of_entries = 1
frame_type = 30 /* same */
}
上面字节码中左边的数字代表指令地址(指令偏移),即 PC 寄存器中可能存储的值,然后执行引擎读取 PC 寄存器中的值,并执行该指令,中间的就是指令,后面的#+数字则是运行时常量池中的符号引用,具体后面会说。
1.使用PC寄存器存储字节码指令地址有什么用呢?
2.PC寄存器为什么被设定为私有的?
原文:https://www.cnblogs.com/niulongwei/p/14838890.html