1. 什么是程序计数器
在JVM(Java虚拟机)中,程序计数器(Program Counter Register) 是一块较小的内存空间,它是线程私有的数据结构,每个线程在创建时都会独立拥有一个程序计数器。
它的核心作用是存储当前线程正在执行的 JVM 指令的地址(或偏移量),是控制程序执行流程的关键组件。
程序计数器的主要特性:
-
线程私有
它是线程安全的,每个线程都有独立的程序计数器,互不干扰。这是JVM多线程机制的基础之一(线程切换后能恢复到正确的执行位置)。 -
存储指令地址
-
如果线程正在执行Java方法,程序计数器记录的是当前正在执行的JVM指令的地址(即方法区中指令的偏移量)。
-
如果执行的是Native方法(如本地C/C++代码),程序计数器的值为空(
undefined
),因为Native方法的执行不受JVM管理。
-
-
不会内存溢出(OOM)
程序计数器是JVM规范中唯一没有规定任何OutOfMemoryError
情况的区域,其生命周期随线程的创建而创建,随线程结束而销毁。
2. 示例说明
我们可以通过指令去打印堆栈大小,查看局部变量的数量和方法的参数。
javap -v xx.class
比如有一个线程的执行顺序如下:
假设该线程开始执行:
执行开始是从第一行开始执行,
当这个 线程1 执行至 第10行时,时间片被夺走,该线程没有执行权,
为了下次获取执行权能继续执行,程序计数器 就会记录当前位置。