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

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


http://www.kler.cn/a/597659.html

相关文章:

  • 摄影工作室预约管理系统基于Spring BootSSM
  • 校园自习室预约小程序(源码+部署教程)
  • 基于Spring Boot的健身房管理系统的设计与实现(LW+源码+讲解)
  • python网络爬虫开发实战之网页数据的解析提取
  • 如何在Spring Boot项目中集成LangChain4J开源开发框架
  • 论文阅读:2024-NAACL Semstamp、2024-ACL (Findings) k-SemStamp
  • 【第21节】windows sdk编程:网络编程基础
  • 【Spring】Spring Task详解
  • java设计模式之建造者模式《装修启示录》​
  • MAC-在使用@Async注解的方法时,分布式锁管理和释放
  • 嵌入式开发之STM32学习笔记day08
  • Mac:Ant 下载+安装+环境配置(详细讲解)
  • Web3如何影响未来的社交平台:去中心化社交的兴起
  • 区块链在医疗数据共享中的应用:解锁安全与透明的新维度
  • 广度优先搜索(BFS) vs 深度优先搜索(DFS):算法对比与 C++ 实现
  • 洛谷 P10108 [GESP202312 六级] 闯关游戏 题解
  • Android Studio控制台中文乱码解决方案
  • Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
  • LeetCode热题100精讲——Top1:两数之和【哈希】
  • 如何编写一个Spring Boot Starter