阅读量:0
目录
1- 引言:程序计数器
1-1 程序计数器是什么?为什么用程序计数器?(What)(Why)
- 程序计数器 是运行时数据区的一部分,称为 PC register。
- 它是线程私有的,不存在线程安全问题,主要用于保存字节码行号,记录正在执行的字节码指令的地址。
2- 核心:程序计数器的原理(How)
2-1 使用 javap 查看程序计数器的作用
- 打印堆栈大小,局部变量的数量和方法的参数。
javap -v xx.class
- 举例说明:程序计数器的作用
public class Application { public static void main(String[] args) { System.out.println("hello world"); } }
对于上述代码
- 获取 class 文件:通过编译找到目标
target
文件夹中的 class 文件。 - 反汇编字节码:右键 class 文件,打开命令窗口,输入
javap -v Application.class
命令查看字节码的反汇编信息。 - 字节码分析:
- getstatic:获取静态变量
System.out
,它是一个静态属性,类型为PrintStream
。 - ldc:加载常量
hello world
,这是一个字符串常量。 - invokevirtual:调用方法
PrintStream.println
,打印字符串。 - return:结束方法执行。
- getstatic:获取静态变量
- 字节码执行顺序:字节码指令按顺序执行,程序计数器记录每个线程的执行行号。
- 多线程示例:程序计数器记录每个线程执行的行号,确保线程被中断后可以继续执行。
结论:对于 一行 Java 代码在被转为字节码执行时,会被拆分成很多行进行执行,之所以需要程序计数器是因为,通过程序计数器可以记录 字节码行号,记录正在执行的字节码指令的地址 。
2-2 多线程下程序计数器原理举例
- 多线程环境下,程序计数器通过记录每个线程的执行行号,确保线程在被中断后能从中断处继续执行。
- 比如线程 1 先执行到第 10 行,此时时间片被 线程2 夺走,当下次再次切换回线程 1 时候,程序计数器使线程 1 可以继续执行第 10 行 字节码。