漫画JVM
一、JVM内存模型顺口溜 🎵
🎤 经典记忆口诀
堆栈方法三兄弟,线程共享要分清
堆里对象住得多,新生老年分两区
栈帧方法调用链,局部变量操作栈
方法区里存什么?类信息常量池
程序计数指令跑,本地方法有专栈
直接内存虽然好,别忘GC管不到
🌟 升级版记忆歌谣
Java虚拟机内存,好比一座大房子
堆区是个大仓库,对象实例都住这
栈区像个办公楼,每层一个方法组
方法区是图书馆,类的信息静静放
PC寄存器是导航,指引程序往哪航
本地栈给C++用,直接内存堆外功
二、JVM内存模型可视化图表
🏗️ JVM内存区域划分
// JVM内存模型完整图解
public class JVMMemoryModel {
/**
* JVM内存区域全景图:
*
* ┌─────────────────────────────────────────────────────────────┐
* │ JVM内存区域 │
* ├─────────────────────────────────────────────────────────────┤
* │ 线程共享区域 │
* │ ┌─────────────────┐ ┌─────────────────────────────────┐ │
* │ │ 方法区/元空间 │ │ Java堆 │ │
* │ │ Method Area │ │ Java Heap │ │
* │ │ Metaspace │ │ ┌─────────────┬─────────────┐ │ │
* │ │ │ │ │ 新生代 │ 老年代 │ │ │
* │ │ 类信息 Class │ │ │ Young │ Old │ │ │
* │ │ 常量池 Pool │ │ │ ┌─────────┐ │ │ │ │
* │ │ 字符串 String │ │ │ │ Eden │ │ │ │ │
* │ │ │ │ │ ├───┬───┤ │ │ │ │
* │ └─────────────────┘ │ │ │S0 │S1 │ │ │ │ │
* │ │ │ └───┴───┘ │ │ │ │
* │ │ └─────────────┴─────────────┘ │ │
* ├─────────────────────────────────────────────────────────────┤
* │ 线程私有区域 │
* │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
* │ │ 程序计数器 │ │ 虚拟机栈 │ │ 本地方法栈 │ │
* │ │ PC │ │ Stack │ │ Native Stack │ │
* │ │ │ │ │ │ │ │
* │ │ 指令地址 │ │ 栈帧Frame │ │ JNI方法调用 │ │
* │ │ 线程独有 │ │ 局部变量 │ │ │ │
* │ │ │ │ 操作栈 │ │ │ │
* │ └─────────────┘ └─────────────┘ └─────────────────────┘ │
* ├─────────────────────────────────────────────────────────────┤
* │ 堆外内存 │
* │ ┌─────────────────────────────────────────────────────┐ │
* │ │ 直接内存 Direct Memory │ │
* │ │ NIO Buffer、Netty、网络IO缓冲区 │ │
* │ └─────────────────────────────────────────────────────┘ │
* └─────────────────────────────────────────────────────────────┘
*/
}
三、JVM内存区域形象比喻 🏠
🎭 "Java大厦"的故事
// 用生活化的比喻来理解JVM内存模型
public class JVMMemoryStory {
/**
* 🏢 想象JVM是一座"Java大厦"
*
* 🏠 Java堆 = 居民住宅区
* - 新生代 = 临时公寓(Eden伊甸园 + S0/S1宿舍)
* - 老年代 = 养老社区(住久了自然搬过来)
*
* 📚 方法区 = 大厦图书馆
* - 存放所有住户的档案信息(类信息)
* - 常量池 = 公共资源库(共享的字符串、数字)
*
* 🏢 虚拟机栈 = 办公楼
* - 每个线程有自己的办公室
* - 栈帧 = 办公桌(局部变量、操作记录)
*
* 🧭 程序计数器 = GPS导航
* - 告诉CPU下一步去哪里
*
* 🔧 本地方法栈 = 维修部门
* - 专门处理C/C++的维修工作
*
* ⚡ 直接内存 = 停车场
* - 在大厦外面,速度快但GC管不到
*/
// 内存分配的生动比喻
public void memoryAllocationStory() {
/**
* 📖 对象创建的奇幻之旅:
*
* 1️⃣ new Person() - 一个新居民要入住
* 2️⃣ 先去Eden伊甸园报到(最舒适的新人区)
* 3️⃣ Eden住满了,来一次Minor GC大扫除
* 4️⃣ 存活的居民搬到S0宿舍(第一次筛选)
* 5️⃣ 又满了再GC,S0和S1来回搬(像宿舍换房)
* 6️⃣ 搬家15次还活着,恭喜!搬到老年区享福
* 7️⃣ 老年区也满了,Full GC大清理(全民搬家)
*/
}
}
四、记忆技巧和考点攻略 🎯
🧠 数字记忆法
// JVM关键数字记忆口诀
public class JVMNumbers {
/**
* 🔢 重要数字记忆:
*
* 8:1:1 = Eden:S0:S1 比例
* 15次 = 晋升老年代的默认年龄阈值
* 32K = 默认栈大小(32位系统)
* 1M = 默认栈大小(64位系统)
* 21M = JDK8默认元空间初始大小
* 80% = 触发G1 Mixed GC的老年代占用率
* 200ms = G1默认最大暂停时间目标
* 2MB = G1默认region大小
*/
// 记忆口诀
String numberMnemonic =
"八一一比例Eden区," +
"十五年龄晋升路," +
"栈大小分三二六四," +
"元空间二十一起步," +
"G1八成Mixed触发," +
"二百毫秒暂停护," +
"两兆region分得细," +
"数字记牢面试无忧!";
}
📝 高频面试考点速记
// JVM面试必背考点清单
@Component
public class JVMInterviewPoints {