今天继续给大家分享JVM的相关知识,今天介绍一下JVM内存区域的程序计数器。
1、程序计数器概念
JVM中的程序计数寄存器(Program Counter Register)中Register的命名来源于CPU的寄存器,寄存器用来存储指令相关的现场信息。
CPU只有把数据装载到寄存器中才能够正常执行指令。
JVM中的寄存器不是物理上的寄存器而是对物理寄存器的抽象模拟。
程序计数器有时候也被称为为程序钩子
2、程序计数器的作用
程序计数器是JVM内存区域中一块较小的内存空间,可以认为是当前Java线程所执行的字节码的行号指示器。字节码解释器工作是通过改变这个计数器的值来定位选取下一条待执行的字节码指令,选择、循环、异常处理、线程恢复等功能都需要依赖程序计数器来完成。
说明:JVM虚拟机为了保证线程切换后还能恢复到上次正确执行的位置,JVM给每条Java线程都分配了一个独立的程序计数器,这样各线程之间计数器互不影响,独立存储和对应的Java线程生命周期保持一致。
-
字节码解释器通过改变程序计数器来依次读取指令,从而实现Java代码的流程控制,比如:顺序执行、选择、循环、异常处理等。
-
在多线程的情况下,程序计数器主要用于记录当前线程执行的具体位置,这样在线程切换回来的时候知道该线程从哪一个环节开始执行。
3、程序计数器的特点
-
每个Java线程独有,与其对应的Java线程的生命周期保持一致。
-
占用JVM内存区域很小的一块(可忽略不计),读取速度很快
-
负责准确记录每个线程当前执行到的具体位置
-
执行本地方法,程序计数器会存储undefined
-
JVM中唯一一个不会出现Out Of Memory Error(内存溢出错误)的区域,也不需要进行垃圾回收