JVM 专题:内存区域、类加载、垃圾回收、参数调优与线上排查
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、热部署等话题需要它和内存区域一起看。垃圾回收同时依赖两者:分代回收建立在对象分配规律上,元空间回收又牵连类加载器的卸载。排查是终点,需要前三组全部就位。
推荐学习顺序
- 粗读 JVM 整体介绍,知道 JVM 管什么、不管什么,半小时即可。
- 精读内存区域(重点):画一遍运行时数据区图,动手写代码复现栈溢出和堆 OOM。
- 学类加载:按「Class 文件 → 加载过程 → 双亲委派」推进,重点理解双亲委派解决的问题和 SPI 等打破委派的场景。
- 深入垃圾回收(重点):先懂存活判断与三大算法,再看收集器——理解 CMS 的碎片、G1 的 Region 与停顿预测、ZGC 的着色指针,比背名字重要。
- 过一遍参数与工具:
-Xms/-Xmx、GC 日志、OOM 自动 dump 是底线配置;工具先练熟 jstat 看 GC 节奏、jstack 看线程、jmap/jcmd 导堆。 - 走一遍线上排查:在测试环境人为制造 CPU 飙高和内存泄漏,按「监控 → 取证 → 分析 → 修复」完整演练一次。
每个主题一句话
- 整体认知:JVM 为什么存在——跨平台与自动内存管理的代价和收益。
- 内存区域:对象和线程的数据放在哪、为什么会 OOM。
- 类加载:字节码如何变成可用的类,以及类之间如何隔离。
- 垃圾回收:哪些对象可以收、谁来收、停顿时发生了什么。
- 参数调优:如何用参数把内存行为约束在业务 SLA 内。
- 线上排查:出问题时用证据链定位根因,而不是靠猜。
学习建议
- 边学边动手:本地开
-Xlog:gc*(JDK 9+)观察一次 Young GC 的触发与回收前后变化,比背收集器名词更有体感。 - 面试导向的话,可以先过一遍本专题的面试题总结,把答不完整的模块标出来再回炉对应章节。
- 所有结论都标注 JDK 版本:永久代与元空间、CMS 与 G1 的默认地位,随版本变化很大。

