JVM 调优 最常见的 8 大问题
一、最常见的 8 大 JVM 问题(90% 调优都围绕这些)
1. 频繁 Young GC / Minor GC 过多
- 现象:CPU 高、接口响应慢、GC 日志刷屏
- 原因:Eden 区太小、对象创建太快
- 调优方向:加大新生代、增大 Eden 区
2. 频繁 Full GC 或 Full GC 耗时过长
- 现象:系统卡顿、接口超时、服务雪崩
- 原因:老年代满、内存泄漏、元空间不足、大对象多
- 调优方向:排查内存泄漏、调整老年代大小、换 GC 收集器
3. 内存泄漏(Memory Leak)
- 现象:Full GC 越来越频繁,堆内存只升不降
- 原因:静态集合、线程池没关闭、连接未释放
- 调优方向:MAT、jstack、jprofiler 排查泄漏点
4. OOM 内存溢出
最常见 3 种:
- java.lang.OutOfMemoryError: Java heap space 堆溢出
- java.lang.OutOfMemoryError: Metaspace 元空间溢出
- java.lang.OutOfMemoryError: Direct buffer memory 直接内存溢出
5. 对象过早晋升老年代(Premature Promotion)
- 现象:老年代增长快,触发 Full GC
- 原因:Survivor 太小、对象存活时间长
- 调优方向:调大 Survivor、调整
-XX:MaxTenuringThreshold
6. 大对象直接进入老年代
- 现象:老年代暴涨
- 原因:大数组、大字符串、大缓冲区
- 调优方向:调整
-XX:PretenureSizeThreshold、代码优化
7. 元空间(Metaspace)不足
- 现象:频繁 Full GC、Metaspace OOM
- 原因:反射、动态代理、类加载过多
- 调优方向:设置
-XX:MetaspaceSize和-XX:MaxMetaspaceSize
8. GC 停顿时间过长(STW 长)
- 现象:接口超时、交易卡顿
- 原因:使用串行 GC / 并行 GC、堆太大
- 调优方向:使用 G1 / ZGC / Shenandoah
二、JVM 调优最核心的 3 个目标(记住这 3 点就够)
- 减少 Full GC 次数(最好 几小时 甚至 一天一次)
- 缩短 Full GC 耗时(< 200ms 最好)
- 避免 OOM
三、最经典的调优口诀(面试必背)
- Minor GC 多 → 新生代太小
- Full GC 多 → 老年代满 / 内存泄漏
- 对象晋升快 → Survivor 太小
- 停顿时间长 → 换 G1/ZGC
- Metaspace 爆 → 加大元空间
四、你最需要的:一套通用生产调优参数
-Xms4g -Xmx4g
-XX:NewRatio=1
-XX:SurvivorRatio=8
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
总结
JVM 调优 90% 的问题就是这 8 类:
- Young GC 频繁
- Full GC 频繁 / 耗时久
- 内存泄漏
- OOM
- 对象过早晋升
- 大对象进老年代
- 元空间溢出
- GC 停顿过长

浙公网安备 33010602011771号