读《深入理解 Java 虚拟机》:从背 JVM 知识点到建立问题证据链
本文以《深入理解 Java 虚拟机》学习笔记为阅读入口,结合当前 JDK 25 诊断与 GC 文档重写。这里不再按章节列知识点,而是讨论怎样把 JVM 原理变成生产排查能力。 学习 JVM 很容易掉进两个极端:一种只背“堆、栈、方法区”,另一种一遇到问题就复制一串 -XX 参数。前者解释不了线上现象,后者可能暂时改变现象,却没有证明原因。 这本书真正值得反复阅读的地方,是它建立了从语言代码到虚拟机实现、再到操作系统资源的映射。把这套映射用于工作时,核心不是记住多少名词,而是形成下面这条链路: 用户症状 → 系统指标 → JVM 运行数据 → 可复查证据 → 代码原因 → 对照验证 内存区域图只是起点,进程预算才是现场 -Xmx4g 不代表 Java 进程最多只用 4 GiB。容器或宿主机看到的是整个进程,它还包含: 区域 常见内容 典型风险 Java Heap 普通对象和数组 泄漏、缓存无界、分配过快 Metaspace 类元数据 动态生成类、ClassLoader 无法回收 Thread Stack 平台线程栈帧 线程数过多、单栈配置过大 Direct/Native Memory DirectByteBuffer、JNI、GC 结构等 堆很健康但 RSS 持续增长 Code Cache JIT 编译后的机器码 编译受限、性能退化 因此容器内存规划不能只把 limit 设置成 Xmx。至少要给 metaspace、直接内存、线程栈、JIT、GC 和本地库留下余量,并用实际工作负载观察 RSS 峰值。 ...