JVM运行时数据区内部结构难记?一个例子优化记忆

JVM 运行时数据区是什么?

JVM 运行时数据区就是 Java 程序跑起来时,JVM 用来存放和管理数据的"仓库"。它分成几个区域,每个区域有不同的作用。就像一个超市,里面有不同的地方用来放货、记账、管理顾客等。下面用超市的比喻来讲解每个区域的作用。


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

🔹 原始知识

  • 是一块较小的内存空间,保存当前线程执行的字节码指令地址。
  • 每个线程都有自己独立的程序计数器,互不影响。
  • 如果执行 Java 方法,计数器记录字节码指令地址;如果执行本地方法(Native Method),值为 undefined
  • 唯一不会抛出 OutOfMemoryError 的区域。

🛒 超市类比

解释 :每个线程的"小本子",记录顾客(线程)买东西走到哪一步了,防止乱套。
例子 :顾客 A 的小票写着"现在该结账第 3 件商品了",顾客 B 的小票写"第 1 件"。收银员看小票就知道谁该干啥。程序计数器就像这个小票,告诉线程下一步跑哪条指令。
特点:空间小,每个顾客(线程)独立拥有,不会塞满。

2. 虚拟机栈 (JVM Stack)

🔹 原始知识

  • 线程私有,生命周期与线程相同。
  • 由多个"栈帧"(Stack Frame)组成,每次方法调用都会创建一个栈帧。
  • 栈帧包含 局部变量表、操作数栈、动态链接、方法返回地址 等信息。
  • 方法执行时 入栈 ,执行完毕 出栈
  • 可能抛出 StackOverflowError(栈溢出)或 OutOfMemoryError(内存不足)。

🛒 超市类比

解释 :每个线程的"购物篮",用来存放买的东西和记录价格,结账时逐个处理。
例子 :顾客 A 拿了个篮子,先放一瓶可乐(调用方法 A),再放一袋薯片(调用方法 B)。结账时从篮子里一件件拿出来(方法返回)。
特点:顾客(线程)独享,装不下就报错。

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

🔹 原始知识

  • 线程私有,为 本地方法(Native Method,通常由 C/C++ 实现) 提供服务。
  • 用于存储本地方法的执行状态,可能与 JVM 栈合并。
  • 可能抛出 StackOverflowError 或 OutOfMemoryError。

🛒 超市类比

解释 :这是给"外包服务"用的栈,比如超市请了送货员,送货员有自己的记录本。
例子 :顾客 A 要买牛奶,但超市没货,需要外面的供应商送货(Java 调用 C 语言方法)。供应商记在本子上"送 1 箱牛奶到顾客 A",这个本子就是本地方法栈。
特点:跟虚拟机栈类似,但专门给"外包活儿"用。

4. 堆 (Heap)

🔹 原始知识

  • JVM 最大的内存区域,所有线程共享。
  • 用于存放 对象实例和数组,几乎所有对象都在这里分配内存。
  • 垃圾回收(GC) 主要针对这里,分为 新生代 (Eden、Survivor)和 老年代
  • 可能抛出 OutOfMemoryError(堆溢出)。

🛒 超市类比

解释 :超市的"大仓库",所有顾客共享,存放各种商品(对象)。
例子 :超市货架上摆着可乐、薯片,顾客 A 和 B 都能来拿。这些商品就是 Java 的对象,堆是所有线程共享的地方。超市定期清理过期商品(垃圾回收),货架满了就报错(OutOfMemoryError)。
特点:大家共用,空间大,需要定期清理(GC)。

5. 方法区 (Method Area)

🔹 原始知识

  • 线程共享,存储 类信息、常量、静态变量、JIT 编译后的代码 等。
  • JDK 8 之前 叫"永久代"(Permanent Generation),JDK 8 之后 移到"元空间"(Metaspace)。
  • 常量池(Runtime Constant Pool) 是方法区的一部分,存放字面量和符号引用。
  • 可能抛出 OutOfMemoryError(方法区溢出)。

🛒 超市类比

解释 :超市的"说明书和账本",存放商品目录、固定规则等信息。
例子 :超市有个柜子,里面放着商品目录(类信息),比如"可乐:2 元/瓶,生产商:可口可乐公司",还有固定记录(常量),"超市营业时间:8:00-22:00"。
特点:所有人共用,变化少,像超市的"档案室"。

🔹 用超市整体举个例子

场景:顾客 A 在超市买东西。

JVM 组件 超市类比
程序计数器 顾客的小票,记录结账进度
虚拟机栈 购物篮,存放买的商品和步骤
本地方法栈 送货员的本子,记录外包订单
货架,所有顾客共享商品
方法区 说明书和账本,存放商品目录和规则

🔹 大白话总结

  • 程序计数器:顾客的小票,记下一步该干啥。
  • 虚拟机栈:顾客的购物篮,装着临时买的东西。
  • 本地方法栈:送货员的本子,给外包服务用的。
  • :超市货架,所有顾客共享的商品。
  • 方法区:超市说明书,记录商品信息和超市规则。

这下 JVM 运行时数据区是不是更容易记住了? 😊

相关推荐
bing_1581 小时前
JVM 类加载器之间的层次关系,以及类加载的委托机制
java·jvm
PureWT1 小时前
JVM的组成及各部分的作用
jvm
XYN615 小时前
【嵌入式学习2】内存管理
c语言·开发语言·jvm·笔记·嵌入式硬件·学习
张彦峰ZYF8 小时前
深入解析 Java GC 调优:减少 Minor GC 频率,优化系统吞吐
java·jvm·算法·zyf jvm知识储备分享
郭天宇 abfore14 小时前
JVM(基础篇)
jvm
陈卓4101 天前
JVM 知识点梳理
java·jvm·后端
齐 飞1 天前
JVM类加载过程详解
java·jvm·笔记
rider1891 天前
深入浅出JVM性能优化:从理论到实践
java·jvm
齐 飞1 天前
JVM类文件结构详解
java·jvm·笔记