JVM的程序计数器

一、程序计数器是什么(通俗理解)

你可以把程序计数器想象成 JVM 里的 "执行进度条" 或 "书签"。

在多线程环境下,CPU 会快速切换执行不同的线程。当某个线程被暂停(比如时间片用完),程序计数器就会记录下这个线程当前执行到哪条字节码指令的地址;等这个线程再次获得 CPU 执行权时,JVM 就能根据计数器里的记录,精准地从暂停的位置继续执行,而不会从头再来。

1.1.1 定义

它是一块比较小的内存空间,是当前线程正在执行的那条字节码指令的地址。

1.1.2 作用

字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制。

在多线程的情况下,程序计数器记录的是当前线程执行的位置,从而当线程切换回来时,就知道上次线程执行到哪了。

1.1.3 特点

是一块较小的内存空间

线程私有,每条线程都有自己的程序计数器

生命周期与线程相同

是唯一一个不会出现OOM的内存区域

二、核心特点与作用

1. 核心作用
  • 记录执行位置 :对于执行 Java 方法的线程,计数器存储的是当前正在执行的字节码指令的地址(准确说是字节码指令的偏移量);
  • 线程私有 :每个线程都有自己独立的程序计数器,互不干扰。这是 JVM 规范中少数几个不会抛出 OutOfMemoryError的内存区域;
  • 处理本地方法 :如果线程正在执行的是 Native 方法(比如调用 C/C++ 写的方法),这个计数器的值会是undefined(未定义),因为 Native 方法不是 Java 字节码,不需要记录字节码地址。
2. 为什么需要它?

举个简单的例子:假设你写了一段循环代码:

java 复制代码
public class CounterDemo {
    public static void main(String[] args) {
        int i = 0;
        while (i < 5) {  // 字节码指令1
            System.out.println(i);  // 字节码指令2
            i++;  // 字节码指令3
        }
    }
}

当线程执行到i++(指令 3)时被 CPU 切换走,程序计数器会记录 "指令 3 的地址";等线程再次执行时,会直接从i++之后继续,而不是重新从int i=0开始。

三、程序计数器的底层细节(新手重点掌握)

  1. 内存占用极小:程序计数器是 JVM 中占用内存最小的区域,它只需要存储指令地址,通常是一个整数(32 位或 64 位,取决于 CPU 架构);
  2. 无 OOM 风险:JVM 规范明确规定,程序计数器不会发生 OutOfMemoryError,因为它的内存大小是固定的(每个线程一个计数器,大小可控);
  3. 与 CPU 寄存器的区别
    • 物理 CPU 的寄存器是硬件层面的,数量极少;
    • JVM 的程序计数器是内存层面的 "抽象寄存器",每个线程都有一份,模拟 CPU 寄存器的功能。

总结

  1. 程序计数器是 JVM 的 "执行书签",记录线程当前执行的字节码指令地址,保证线程切换后能恢复执行;
  2. 它是线程私有的内存区域,且不会抛出 OutOfMemoryError
  3. 执行 Native 方法时,程序计数器的值为 undefined。
相关推荐
小江的记录本2 小时前
【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小江的记录本7 小时前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
jameslogo11 小时前
类加载机制
jvm
雪度娃娃12 小时前
转向现代C++——优先选用删除函数而非private未定义函数
java·jvm·c++
努力发光的程序员12 小时前
面试官与程序员谢飞机的3轮Java大厂面试问答实录:涵盖Spring Boot、微服务与数据库技术
java·jvm·spring boot·redis·面试·hibernate·microservices
橙淮13 小时前
并发编程(四)
java·jvm
Python+9913 小时前
C++ 内存模型 & 底层原理
java·jvm·c++
右耳朵猫AI13 小时前
Java & JVM技术周刊 2026年第19周
java·开发语言·jvm
1candobetter13 小时前
单接口性能测试实践总结:压测方案设计、成功判定与 JVM 监控分析
java·jvm·压力测试·测试
plainGeekDev1 天前
Android运行时面试题:ART和JVM的区别都搞不清,别写精通了
jvm·面试·kotlin