# 知识体系大纲

> 本章节涵盖 Java 虚拟机的核心知识体系，从内存模型到垃圾回收、类加载机制、字节码执行引擎到生产调优实战。

## 📚 学习路线

```
内存模型 → 垃圾回收 → 类加载机制 → 字节码与执行引擎 → 调优实战
```

## 🎯 核心内容

### 第一部分：内存模型与内存区域

理解 JVM 运行时数据区的划分与各区域的作用。

* **运行时数据区**：堆、方法区、虚拟机栈、本地方法栈、程序计数器
* **堆内存结构**：新生代、老年代、永久代/元空间
* **对象的创建与内存布局**：对象头、实例数据、对齐填充
* **内存溢出与泄漏**：OOM 场景分析与排查

**学习时长**：2-3 周 **难度**：⭐⭐⭐

### 第二部分：垃圾回收 ⭐ 重点

深入理解 GC 原理与各代垃圾收集器的设计思想。

* **垃圾判定算法**：引用计数法、可达性分析、GC Roots
* **垃圾回收算法**：标记-清除、标记-复制、标记-整理、分代收集
* **经典垃圾收集器**：Serial、ParNew、Parallel Scavenge、CMS
* **新一代垃圾收集器**：G1、ZGC、Shenandoah
* **GC 调优**：GC 日志分析、停顿时间优化、吞吐量调优

**学习时长**：3-4 周 **难度**：⭐⭐⭐⭐⭐

### 第三部分：类加载机制

掌握类的生命周期与类加载器体系。

* **类的生命周期**：加载、验证、准备、解析、初始化、使用、卸载
* **类加载器**：Bootstrap、Extension、Application、自定义类加载器
* **双亲委派模型**：工作原理、打破双亲委派（SPI、OSGi、热部署）
* **类加载实战**：热部署、模块化、类隔离

**学习时长**：1-2 周 **难度**：⭐⭐⭐

### 第四部分：字节码与执行引擎

理解 Java 代码从编译到执行的完整过程。

* **Class 文件结构**：魔数、常量池、访问标志、字段表、方法表、属性表
* **字节码指令**：操作数栈、局部变量表、常用指令集
* **执行引擎**：解释执行、JIT 编译、混合模式
* **方法调用**：静态分派、动态分派、方法表、内联缓存

**学习时长**：2-3 周 **难度**：⭐⭐⭐⭐

### 第五部分：JVM 调优实战

掌握生产环境 JVM 调优的方法论与工具。

* **JVM 参数配置**：堆大小、GC 选择、JIT 编译参数
* **监控与诊断工具**：jps、jstat、jmap、jstack、jcmd、JVisualVM、Arthas
* **性能调优方法论**：GC 调优、内存调优、线程调优
* **故障排查**：CPU 飙高、内存泄漏、死锁、频繁 Full GC

**学习时长**：持续实践 **难度**：⭐⭐⭐⭐

## 🔥 面试高频考点

### 必须掌握（⭐⭐⭐⭐⭐）

1. **JVM 内存区域**
   * 运行时数据区的划分
   * 堆和栈的区别
   * 方法区与元空间的关系
   * 各区域可能的 OOM 异常
2. **垃圾回收机制**
   * GC Roots 有哪些
   * 四种引用类型（强、软、弱、虚）
   * 常见垃圾回收算法
   * CMS 和 G1 的区别
3. **类加载机制**
   * 类加载的过程
   * 双亲委派模型
   * 如何打破双亲委派
   * 类的初始化时机
4. **JVM 调优**
   * 常用 JVM 参数
   * GC 日志分析
   * 内存泄漏排查思路
   * Full GC 频繁的原因

### 深入理解（⭐⭐⭐⭐）

5. **对象创建过程**
   * 类加载检查 → 内存分配 → 初始化零值 → 设置对象头 → 执行 init
   * 内存分配方式：指针碰撞 vs 空闲列表
   * 线程安全：TLAB
6. **JIT 编译优化**
   * 热点代码检测
   * 方法内联
   * 逃逸分析
   * 栈上分配、标量替换
7. **G1 收集器详解**
   * Region 划分
   * Remembered Set
   * 混合回收过程
   * 停顿预测模型
8. **ZGC 与低延迟 GC**
   * 着色指针
   * 读屏障
   * 并发处理
   * 停顿时间目标

### 实战能力（⭐⭐⭐⭐⭐）

* 线上服务 CPU 100% 如何排查
* 线上服务频繁 Full GC 如何处理
* 内存泄漏如何定位
* 如何选择合适的垃圾收集器
* 生产环境 JVM 参数如何配置

## 📖 推荐学习资源

### 书籍

* 《深入理解 Java 虚拟机》 - 周志明（必读）
* 《Java 虚拟机规范》 - Oracle
* 《Java Performance: The Definitive Guide》 - Scott Oaks
* 《垃圾回收的算法与实现》 - 中村成洋

### 博客与文章

* [R 大的 JVM 知乎回答](https://www.zhihu.com/people/rednaxelafx) - JVM 深度解析
* [美团技术团队 JVM 系列](https://tech.meituan.com/) - 生产调优实践
* OpenJDK 源码与文档

### 开源项目

* [OpenJDK](https://github.com/openjdk/jdk) - JVM 源码
* [Arthas](https://github.com/alibaba/arthas) - Java 诊断工具
* [JOL](https://github.com/openjdk/jol) - Java 对象布局分析

## 🎓 学习建议

### 1. 理论与实践结合

每学一个知识点，用工具验证：

```java
// 示例：验证对象内存布局
public class ObjectLayoutTest {
    // 使用 JOL 查看对象大小
    System.out.println(ClassLayout.parseInstance(new Object()).toPrintable());
}
```

### 2. 画图理解

* 画出 JVM 内存区域图
* 画出 GC 过程示意图
* 画出类加载器层次结构

### 3. 阅读源码

按优先级阅读：

1. HotSpot 内存管理模块
2. G1 收集器实现
3. 类加载器实现
4. 解释器与 JIT 编译器

### 4. 动手实验

使用 JVM 参数和工具实际操作：

```bash
# 查看 GC 日志
java -Xms256m -Xmx256m -XX:+PrintGCDetails -XX:+UseG1GC App

# 使用 jstat 监控 GC
jstat -gc <pid> 1000

# 使用 jmap 生成堆转储
jmap -dump:format=b,file=heap.hprof <pid>
```

### 5. 故障模拟

主动制造问题，练习排查能力：

* 模拟 OOM 场景
* 模拟 CPU 飙高
* 模拟内存泄漏
* 模拟死锁

## 💡 学习检查清单

完成每个阶段后，检查是否达到以下标准：

### 内存模型

* [ ] 能画出 JVM 运行时数据区
* [ ] 理解堆的分代结构
* [ ] 知道对象的创建过程和内存布局
* [ ] 能分析各种 OOM 异常的原因

### 垃圾回收

* [ ] 理解可达性分析算法
* [ ] 能对比各种 GC 算法的优缺点
* [ ] 能说出 CMS 和 G1 的工作过程
* [ ] 会分析 GC 日志

### 类加载

* [ ] 理解类加载的完整过程
* [ ] 能解释双亲委派模型
* [ ] 知道如何打破双亲委派
* [ ] 理解 Tomcat 的类加载器设计

### 字节码

* [ ] 了解 Class 文件结构
* [ ] 理解常用字节码指令
* [ ] 知道 JIT 编译的优化手段
* [ ] 理解方法调用的分派机制

### 调优实战

* [ ] 熟练使用 JVM 诊断工具
* [ ] 能进行 GC 调优
* [ ] 能排查线上内存泄漏问题
* [ ] 有完整的 JVM 故障排查思路

## 🚀 开始学习

选择适合你的起点：

* **完全新手**：从「内存模型与内存区域」开始，打好基础
* **有一定基础**：直接进入「垃圾回收」，这是重点
* **准备面试**：重点看「面试高频考点」，结合调优实战
* **深度学习**：研读 HotSpot 源码，理解实现细节

***

**预计总学习时间**：10-14 周

**建议学习节奏**：

* 工作日：每天 1-2 小时理论学习
* 周末：3-4 小时深度学习 + 工具实操

**记住**：JVM 知识需要大量实验验证，光看理论远远不够，一定要动手用工具观察实际行为！

开始你的 JVM 深度学习之旅吧！💪
