JVM性能调优的核心是理解GC机制,通过调整-Xms、-Xmx堆大小和-XX:NewRatio新生代比例,可以显著减少Full GC频率。在生产环境中,监控GC日志(-XX:+PrintGCDetails)是故障排查的第一步,结合jstat或VisualVM工具实时观察内存使用,避免OOM异常。
堆内存结构详解
JVM堆分为年轻代(Eden、Survivor)和老年代。新对象分配在Eden,YGC后存活对象进入S1/S2 Survivor轮换,大对象或多次GC存活直接进老年代。调优时,设置-XX:SurvivorRatio=8(Eden:S0=8:1),-XX:MaxTenuringThreshold=15控制晋升阈值。
GC算法与收集器
Serial GC适合单核,ParNew+CMS是经典组合,G1适合大堆(>4GB),ZGC/LGC是低延迟新时代选择。CMS有碎片问题,用-XX:+UseCMSCompactAtFullCollection缓解。G1分Region管理,-XX:MaxGCPauseMillis=200控制暂停时间。
常见故障排查
OOM时用jmap -dump生成heap dump,MAT分析大对象或内存泄漏。CPU高负载用jstack dump线程,top -H p pid找热点线程,结合jfr火焰图定位热点方法。GC频繁用jstat -gcutil观察YGC/FGC次数和时间占比。
性能调优实战案例
某电商系统Full GC 1分钟,用 Arthas在线诊断,发现大量锁竞争和无效对象创建。调小堆、增大Metaspace(-XX:MetaspaceSize=128m),启用G1后,平均RTT从500ms降到50ms,QPS提升30%。
JVM参数调优指南
基础参数:-Xms=2g -Xmx=2g -XX:MetaspaceSize=256m。GC调优:-XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=45。打印参数:-XX:+PrintGC -Xloggc:gc.log。生产环境禁用RPS偏向锁-XX:-UseBiasedLocking。
监控工具推荐
生产用Prometheus+Grafana监控JVM metrics,结合SkyWalking链路追踪。开发用JConsole、VisualVM、JProfiler。Arthas是神器:jad反编译、ognl执行表达式、trace方法耗时、heapdump导出堆快照。
FAQ
Q: 如何快速定位OOM?
A: 启用-XX:+HeapDumpOnOutOfMemoryError,jmap dump后用MAT或Eclipse Memory Analyzer打开,查Dominator Tree和Leak Suspects。
Q: G1和CMS哪个更好?
A: G1更适合大堆和低延迟,CMS碎片多已deprecated,用G1优先。
Q: JVM参数怎么验证效果?
A: 用jstat -gc和gc.log分析GC次数/时间,结合业务QPS/RTT对比。
Q: Metaspace OOM怎么处理?
A: 增大-XX:MaxMetaspaceSize=512m,检查动态类加载如Spring热部署。