程序计数器
在运行时数据区中,它是线程隔离的一块内存区域,即它是线程私有的内存区域
同时它是一块很小的内存区域,可以看做当前线程所执行字节码的行号指示器。
即,程序计数器就是用于存放下一条指令所在单元的地址的地方
字节码指示器
Java虚拟机通过改变计数器的值来选取需要执行的字节码指令,所以它也是程序控制流的指示器,自然Java程序中的分支、循环、跳转、异常处理、线程恢复等都需要依赖这个计数器来完成。
例子,线程恢复
Java多线程是通过多个线程之间的轮流切换、分配处理器执行时间的方式实现的。在任何一个确定的时间,一个处理器都只会执行一个线程的指令。
所以,当线程切换线程后,要恢复到正确的执行位置,每个线程都需要一个计数器,各个线程互不影响,独立存储。
通过这个计数器,每个线程就能够记录它执行的位置,当线程切换后,就能直接定位到下一条正确指令的位置了
特点
- 如果线程正在运行的是一个Java方法,这个计数器则记录的是正在执行的虚拟机字节码的地址
- 如果正在执行的是一个本地方法,这个计数器则为空
- 此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError异常的区域
- 该内存区域较小,并且是运行时内存区中,被线程隔离
PS:Java方法和本地方法(Native Method)
- Java方法:由java语言编写,编译成字节码存储在class文件中的
- 本地方法:本地方法是由其他语言编写的,比如c、c++等,编译成和处理器相关的代码。本地方法保存在动态连接库中,格式是各个平台专用的,运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。
上面所讲的在执行本地方法的时候,程序计数器为空(undefined),本地方法不是由java语言编写的,所以编译后自然没有字节码地址这么一说了,所以程序计数器是为空的。
以上是我在学《深入理解Java虚拟机》一书的学习记录,如有错误的地方,希望大佬们能够再评论区指点指点,互相学习。