什么是程序计数器
程序计数器可以看作是JVM对CPU程序计数器的一种模拟;其是一块较小的内存空间,用来存储当前线程的所执行的字节码的行号。
注意:
- 程序计数器是线程私有的,每个线程都有一个自己的程序计数器。
- 在这块内存空间中不存在任何
OutOfMemoryError
情况。
存在的意义
虽然Java字节码在未经过即时编译器编译前,是通过字节码解释器解释执行。一行一行的读取、解释、执行,即使存在分支、跳等操作,只要是按照流程执行的,其实不需要程序计数器也可以正常执行。
因为Java的多线程是通过线程轮流切换、分配处理器时间片的方式来实现的,所以在任何一个时刻,一个CPU的内核只会执行一个线程中的命令,所以一旦当前线程的时间片结束然后被挂起,当又轮到这个被挂起的线程执行的时候,如何去恢复被挂起前的状态?这个就是依靠程序计数器,保存当前执行的字节码的位置。
关于native方法
程序计数器保存的是当前执行的Java字节码指定的地址。
如果当前执行的是native方法,因为其并不是Java字节码,所以当执行的是native方法的时候,程序计数器中保持的地址是空的。
参考
- 深入理解Java虚拟机 JVM高级特性与最佳实践
- 01-JVM内存模型:程序计数器
- JVM 程序计数器