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 点就够)

  1. 减少 Full GC 次数(最好 几小时 甚至 一天一次)
  2. 缩短 Full GC 耗时(< 200ms 最好)
  3. 避免 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 类:
  1. Young GC 频繁
  2. Full GC 频繁 / 耗时久
  3. 内存泄漏
  4. OOM
  5. 对象过早晋升
  6. 大对象进老年代
  7. 元空间溢出
  8. GC 停顿过长
posted @ 2026-03-05 14:47  小兵要进步  阅读(3)  评论(0)    收藏  举报