JVM 是 Java 后端绕不开的基础,但直接扎进收集器细节很容易迷路。这篇学习地图把 JVM 拆成五个主题组,说明每组解决什么问题、彼此怎么依赖,并给出一条从「建立全景」到「线上实战」的推荐学习顺序。

主题分组:五块拼图

1. JVM 整体认知 —— 回答「JVM 是什么、为什么要学」。建立 JVM 在 Java 生态中的位置:跨平台的载体、内存与类加载的管理者。这一步只需粗读,目的是给后面的细节找到挂点。

2. 内存区域与对象 —— 回答「数据放在哪、对象怎么生」。核心内容:运行时数据区(程序计数器、虚拟机栈、堆、方法区、直接内存)、对象创建的五个步骤、对象头与访问定位、各类 OOM 的成因。这是整个 JVM 的地基,GC 和排查都建立在内存模型之上。

3. 类文件与类加载 —— 回答「代码怎么进入 JVM」。核心内容:Class 文件结构(魔数、常量池、方法表)、类加载生命周期(加载、验证、准备、解析、初始化)、类加载器体系与双亲委派模型。它与内存区域相接:类的元数据就住在方法区/元空间,初始化时机又决定了静态状态何时可见。

4. 垃圾回收与参数 —— 回答「内存怎么收、怎么调」。核心内容:可达性分析与 GC Roots、四种引用、标记-清除/复制/标记-整理算法、分代思想、CMS/G1/ZGC 等收集器的取舍、常用 JVM 参数与 GC 日志配置。这是面试与调优的主战场,依赖前两组的内存模型与对象分配知识。

5. 监控工具与线上排查 —— 回答「出问题怎么办」。核心内容:jps/jstat/jmap/jstack/jcmd 等 JDK 自带工具、MAT 分析堆转储、JFR 低开销采样,以及 CPU 飙高、内存泄漏、频繁 Full GC 的完整排查流程。它是前四组的实战出口。

依赖关系

整体认知
│
▼
内存区域与对象 ──► 类文件与类加载
│ │
└────────┬───────────┘
▼
垃圾回收与参数
│
▼
监控工具与线上排查

内存区域是一切的前提:不懂堆与栈的划分,GC 的分代、Full GC 的成因都无从谈起。类加载相对独立,但元空间 OOM、热部署等话题需要它和内存区域一起看。垃圾回收同时依赖两者:分代回收建立在对象分配规律上,元空间回收又牵连类加载器的卸载。排查是终点,需要前三组全部就位。

推荐学习顺序

  1. 粗读 JVM 整体介绍,知道 JVM 管什么、不管什么,半小时即可。
  2. 精读内存区域(重点):画一遍运行时数据区图,动手写代码复现栈溢出和堆 OOM。
  3. 学类加载:按「Class 文件 → 加载过程 → 双亲委派」推进,重点理解双亲委派解决的问题和 SPI 等打破委派的场景。
  4. 深入垃圾回收(重点):先懂存活判断与三大算法,再看收集器——理解 CMS 的碎片、G1 的 Region 与停顿预测、ZGC 的着色指针,比背名字重要。
  5. 过一遍参数与工具:-Xms/-Xmx、GC 日志、OOM 自动 dump 是底线配置;工具先练熟 jstat 看 GC 节奏、jstack 看线程、jmap/jcmd 导堆。
  6. 走一遍线上排查:在测试环境人为制造 CPU 飙高和内存泄漏,按「监控 → 取证 → 分析 → 修复」完整演练一次。

每个主题一句话

  • 整体认知:JVM 为什么存在——跨平台与自动内存管理的代价和收益。
  • 内存区域:对象和线程的数据放在哪、为什么会 OOM。
  • 类加载:字节码如何变成可用的类,以及类之间如何隔离。
  • 垃圾回收:哪些对象可以收、谁来收、停顿时发生了什么。
  • 参数调优:如何用参数把内存行为约束在业务 SLA 内。
  • 线上排查:出问题时用证据链定位根因,而不是靠猜。

学习建议

  • 边学边动手:本地开 -Xlog:gc*(JDK 9+)观察一次 Young GC 的触发与回收前后变化,比背收集器名词更有体感。
  • 面试导向的话,可以先过一遍本专题的面试题总结,把答不完整的模块标出来再回炉对应章节。
  • 所有结论都标注 JDK 版本:永久代与元空间、CMS 与 G1 的默认地位,随版本变化很大。