当前位置: 首页 > news >正文

理解JVM

JVM(Java 虚拟机)就像一个 "工作车间",里面划分了不同的区域,每个区域有专门的职责。下面用生活化的例子详细解释每个区域的作用:

1. 程序计数器(Program Counter Register)

  • 作用:记录当前线程正在执行的代码行号,相当于 "书签"。
  • 细节
    • 每个线程都有自己的程序计数器(线程私有),互不干扰
    • 如果执行的是 Java 方法,记录的是当前字节码指令的地址
    • 如果执行的是 native 方法(非 Java 代码),计数器值为 undefined
    • 这是 JVM 中唯一不会 OutOfMemoryError 的区域

2. 虚拟机栈(VM Stack)

  • 作用:存储方法调用的临时数据,相当于 "笔记本",记录方法执行时的变量和中间结果。
  • 细节
    • 线程私有,每个方法调用时会创建一个 "栈帧"(Stack Frame)
    • 栈帧包含:局部变量表(方法内定义的变量)、操作数栈(计算过程中临时存放数据)、方法返回地址等
    • 方法调用时入栈,执行完出栈
    • 常见问题:栈深度不够会抛出 StackOverflowError(比如递归调用太深);栈内存不足会抛出 OutOfMemoryError

3. 本地方法栈(Native Method Stack)

  • 作用:和虚拟机栈类似,但专门为 native 方法(如调用操作系统底层功能的代码)服务。
  • 细节
    • 线程私有,具体实现由虚拟机厂商决定
    • 也可能抛出 StackOverflowError 和 OutOfMemoryError

4. 堆(Heap)

  • 作用:存储 Java 中所有的对象实例和数组,是 JVM 中最大的一块内存区域,相当于 "仓库"。
  • 细节
    • 所有线程共享,是垃圾回收(GC)的主要区域
    • JDK 8 之后,字符串常量池也移到了堆中
    • 堆内存不足时会抛出 OutOfMemoryError
    • 现代 JVM 会把堆进一步细分:
      • 新生代(Young Generation):新创建的对象先放这里,分为 Eden 区和两个 Survivor 区(From 和 To)
      • 老年代(Old Generation):存活时间长的对象会移到这里
      • 元空间(Metaspace,JDK 8 之后):替代永久代,存储类信息等(见下面说明)

5. 方法区(Method Area)

  • 作用:存储类的元信息(如类结构、字段、方法、常量等),相当于 "档案库"。
  • 细节
    • 所有线程共享,JDK 8 之前叫 "永久代",JDK 8 之后改名为 "元空间"(Metaspace)
    • 存储内容包括:类的字节码、静态变量、常量池(如字符串常量)、方法信息等
    • 元空间和永久代的区别:元空间使用本地内存,而不是 JVM 内存,默认情况下理论上受限于系统内存
    • 内存不足时会抛出 OutOfMemoryError

6. 运行时常量池(Runtime Constant Pool)

  • 作用:存储编译期生成的各种字面量和符号引用,相当于 "字典"。
  • 细节
    • 是方法区的一部分
    • 包含:字符串常量(如 "abc")、数字常量(如 123)、类和方法的引用等
    • 具有动态性,运行时也能新增常量(如 String.intern () 方法)

总结记忆法

  • 线程私有区(每个线程单独拥有):程序计数器、虚拟机栈、本地方法栈
  • 线程共享区(所有线程共用):堆、方法区(元空间)、运行时常量池

可以把 JVM 想象成一个公司:

  • 程序计数器 = 员工的工作进度表
  • 虚拟机栈 = 员工的工作台(临时放正在处理的文件)
  • 本地方法栈 = 外包团队的工作台
  • 堆 = 公司的仓库(放所有货物)
  • 方法区 = 公司的档案库(存规章制度、人员结构)
  • 运行时常量池 = 档案库中的字典(快速查询常用信息)

这样每个区域的职责和特点就比较清晰了~

http://www.dtcms.com/a/358093.html

相关文章:

  • 蓝牙5.3核心技术架构解析:从控制器到主机的无线通信设计
  • 广东省省考备考(第九十天8.30)——判断推理(强化训练)
  • 项目管理的五个阶段是什么
  • 在线简历生成工具,免费好用
  • 【MLLM】从BLIP3o到BLIP3o-NEXT:统一生成与理解
  • 【Docker】Docker初识
  • AI工具营销落地方案:工业产品营销
  • python pyqt5开发DoIP上位机【诊断回复的函数都是怎么调用的?】
  • 计算机毕设 java 阿歹果园养鸡场管理系统 基于 SSM 框架的果园养鸡场全流程管理系统设计与实现 Java+MySQL 的养殖生产与进销存一体化平台开发
  • SQLSugar 封装原理详解:从架构到核心模块的底层实现
  • uniapp解析富文本,视频无法显示问题
  • HTTP的概念、原理、工作机制、数据格式和REST
  • 卫星信号和无线信号的设备厂商
  • Linux(1)|入门的开始:Linux基本指令
  • 【C++】C++ const成员函数与取地址操作符重载
  • 数据结构 03(线性:单链表)
  • 强化学习-CH6 随机近似
  • Ansible 核心运维场景落地:YUM 仓库、SSH 公钥、固定 IP 配置技巧
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day11
  • 如何取得专案/设计/设定/物件的属性
  • mysql权限user表赋权操作修改
  • 《潮汐调和分析原理和应用》之四S_Tide使用2
  • 整体设计 的语言设计:通用模型语言的标准模板语言的规格模式语言(搜狗汪仔答问)
  • 【计算机网络】生产问题排查:如何使用Wireshark抓包/读取抓包文件进行网络分析
  • 使用AI大模型Seed1.5-VL精准识别开车接打电话等交通违法行为
  • TensorFlow深度学习实战(35)——概率神经网络
  • k8s(自写)
  • Kafka 4.0 生产者配置全解析与实战调优
  • STM32手动移植FreeRTOS
  • 算法(②排序算法)