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

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 运行时数据区是不是更容易记住了? 😊

相关文章:

  • 避坑指南 | 阿里云服务器centos7上MySQL部署优化指南
  • C++之模板进阶
  • 亮相AWE2025,MOVA以科技重塑生活,以美学沟通世界
  • 标贝科技入选2025年市级数据要素市场化配置改革“揭榜挂帅”名单
  • 2025蓝桥杯备赛Day1——B2109 统计数字字符个数
  • 微信小游戏:跳一跳,自动化操作
  • 4.6--入门知识扫盲,路径追踪与路由误导:Tracert攻击 vs ICMP重定向攻击(包你看一遍全记住)
  • squirrel语言全面介绍
  • JAVA学习--java数组--打印稀疏数组和稀疏数组的还原
  • React基础语法速览
  • 每日一题力扣2960.统计已测试设备c++
  • 从零开始:使用 Cython + JNI 在 Android 上运行 Python 算法
  • C++进阶(一)
  • 智能照明与新能源集成的精细化能效管理实践
  • 蓝桥杯备赛-DFS-有奖问答
  • Android中的setInheritRT
  • JAVA_数据结构_栈和队列
  • 实现分布式锁需要考虑哪些问题?
  • 组播策略路由选择
  • SSH密钥认证 + 文件系统权限控制 + Git仓库配置+封存与解封GIT仓库
  • 外交部:中方期待印巴巩固和延续停火势头,避免冲突再起
  • 何立峰:中方坚定支持多边主义和自由贸易,支持世贸组织在全球经济治理中发挥更大作用
  • A股三大股指集体高开
  • 减重人生|走过节食弯路,她如何半年减60斤找回自信?
  • “海豚音”依旧,玛丽亚·凯莉本周来沪开唱
  • 网红街区如厕难,如何多管齐下补缺口?