第6章 · JVM 故障复盘 章节摘要:JVM 层的故障最考验"从黑盒外部推断内部"的能力。本章三个现场:一次 OOM 的堆内存布局透视;一次 Full GC 停顿的收集器选型复盘;一次依赖包冲突引发的类加载诡异行为。三节合起来,就是 jmap、jstack、GC 日志三件套的完整实战。 学习目标 画出 JVM 运行时数据区布局,按 OOM 类型反推故障区域 读 GC 日志判断停顿根因,说出分代收集器与 G1/ZGC 的取舍 讲清类加载五阶段与双亲委派,用 Arbiter 思路排查 NoClassDefFoundError 与 LinkageError 核心概念速览 内存区域的划分不是教科书配图,是 OOM 报错信息的地名表——每一种 OOM 都精确对应一块区域。 子章节导航 6.
章节摘要:JVM 层的故障最考验"从黑盒外部推断内部"的能力。本章三个现场:一次 OOM 的堆内存布局透视;一次 Full GC 停顿的收集器选型复盘;一次依赖包冲突引发的类加载诡异行为。三节合起来,就是 jmap、jstack、GC 日志三件套的完整实战。
内存区域的划分不是教科书配图,是 OOM 报错信息的地名表——每一种 OOM 都精确对应一块区域。
OOM 堆 dump 打开后的侦探工作:泄漏大对象、Finalizer 队列、直接内存,三种 OOM 三个走向。
P99 毛刺的 GC 日志分析,从 CMS 的碎片到 G1 的 Region 再到 ZGC 的着色指针。
同一个类加载出两个 Class 对象的诡异事故,隔离容器的解法。
三节是 JVM 的三大子系统:内存分配(堆结构)→ 内存回收(GC)→ 类与字节码装载(类加载)。OOM 是分配失衡的终点,长停顿是回收跟不上分配的表现,类加载冲突则是装载体系的秩序问题。
子系统 核心工具 事故形态 ------ -------------- -------------------- 内存 jmap dump MAT OOM 三型 回收 GC 日志 jstat 停顿毛刺 频繁 Full GC 装载 jclassload 日志 NoClassDefFound Linkage 冲突
本章的实践建议:把三节的工具各自装进工具箱并演练一次——jmap 与 MAT 在测试环境对一个正常服务做一次 dump 分析,熟悉支配树的读法;给一个 demo 应用开 GC 日志跑压测,亲眼看看 Young 与 Full 的分布形态;再用类加载日志确认某个依赖的实际来源。JVM 排查的难点从来不是命令记不住,而是事故现场的分钟级时间里敢不敢下手。平时练过的动作,深夜才拿得出来。