《Java JVM 通关演练教程》核心答案:以OOM场景为起点,通过jps/jstat/jmap/jstack实时验证内存泄漏、三步解读GC日志、聚焦5个关键参数调优、闭环排查CPU高+超时问题,全程强调“复现→监控→分析→验证”实操链路。

写一份实用的《Java JVM 通关演练教程》,核心不是堆砌概念,而是帮读者在真实场景中“用得上、调得动、看得懂”。重点落在 动手验证 + 典型问题驱动 + 关键指标闭环 上。
一、从一个必现的 OOM 场景开始演练
不讲“内存模型有哪几块”,而是直接启动一个故意泄漏线程局部变量的 Demo(比如不断 new ThreadLocal
二、GC 日志不是天书:三步看懂真实日志
提供一段 G1 GC 的典型日志片段(含 Mixed GC 和 Humongous 分配),逐行标注:
-
时间戳与停顿耗时:如
[2024-04-01T10:23:45.123+0800][12345ms]中的绝对时间和相对 JVM 启动时间 -
回收范围与结果:如
[Eden: 120M(120M)->0B(120M)]表示 Eden 区本次清空,容量未变 -
关键标记:
to-space-exhausted提示晋升失败,humongous allocation暗示大对象问题
三、JVM 参数不是越多越好:只调这 5 个关键项
新手常盲目加 -XX:+UseG1GC -Xms4g -Xmx4g -XX:MaxGCPauseMillis=200 -XX:+PrintGCDetails,但忽略实际效果。教程应强调:
立即学习“Java免费学习笔记(深入)”;
- -Xms 和 -Xmx 必须相等:避免动态扩容导致 GC 不可预测
- MaxGCPauseMillis 是目标,不是承诺:G1 在堆过大或碎片严重时会自动放宽
- PrintGCDetails 必须配合 -Xloggc:gc.log:否则日志刷到 stdout 易丢失
- 禁止无脑加 -XX:+UseStringDeduplication:仅对大量重复字符串有效,且增加 CPU 开销
-
线上慎用 -XX:+HeapDumpOnOutOfMemoryError:dump 文件可能占满磁盘,建议限定数量:
-XX:HeapDumpPath=/tmp/dumps/ -XX:HeapDumpBeforeFullGC
四、一次完整的性能问题排查链路
模拟生产环境 CPU 飙高 + 接口超时:
- 用 top -H 找出高 CPU 线程 PID
- 转成十六进制,用 jstack pid | grep '0xXXXX' -A 10 定位具体线程栈
- 发现是正则匹配死循环 → 检查代码中
Pattern.compile()是否在循环内 - 用 jmap -dump:format=b,file=heap.hprof pid 抓堆快照,用 JProfiler 或 Eclipse MAT 查看对象引用链
- 最终确认:某个缓存 Map 存了上万条未清理的 Pattern 实例
不复杂但容易忽略:每次演练都强调「先复现、再监控、后分析、最后验证修复」这个闭环。参数改了、代码修了,必须重新跑压测对比 GC 频率和 P99 延迟。


















