JVM性能调优的核心目标
提升吞吐量、降低延迟、减少内存占用,确保应用在高负载下稳定运行。调优需结合应用特点、硬件资源和JVM机制进行。
内存区域调优
堆内存(Heap)
通过-Xms和-Xmx设置初始和最大堆大小,避免动态扩容开销。例如:
-Xms4g -Xmx4g
建议初始值与最大值一致,防止运行时调整堆大小引发性能波动。
新生代与老年代比例
使用-XX:NewRatio调整新生代与老年代比例(默认2,即新生代占1/3)。高吞吐应用可增大新生代:
-XX:NewRatio=1
通过-XX:SurvivorRatio调整Eden与Survivor区比例(默认8)。
元空间(Metaspace)
Java 8+使用元空间替代永久代,通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize控制大小:
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
垃圾回收器选择
G1 GC(推荐)
适用于大堆和低延迟场景,通过-XX:+UseG1GC启用。关键参数:
-XX:MaxGCPauseMillis=200(目标最大停顿时间)
-XX:G1HeapRegionSize=4m(分区大小)
ZGC/Shenandoah
适用于超大堆(TB级)和极低延迟(亚毫秒级):
ZGC参数:-XX:+UseZGC -Xmx16g
Shenandoah参数:-XX:+UseShenandoahGC
监控与诊断工具
命令行工具
jstat -gcutil <pid>:实时GC统计jmap -heap <pid>:堆内存分布jstack <pid>:线程快照分析死锁
可视化工具
- VisualVM:监控堆、线程、CPU
- JProfiler:内存泄漏分析
- GC日志分析工具(如GCViewer)
关键参数优化示例
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-XX:InitiatingHeapOccupancyPercent=35
-XX:ConcGCThreads=4
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/path/to/gc.log
常见问题处理
内存泄漏
通过堆转储(jmap -dump:format=b,file=heap.hprof <pid>)分析对象引用链,定位未释放对象。
Full GC频繁
检查老年代占用率、元空间是否不足,或存在大对象分配。调整-XX:NewSize或使用-XX:+ExplicitGCInvokesConcurrent避免System.gc()触发Full GC。
OOM Killer触发
Linux系统可能因物理内存不足终止JVM进程。需确保-Xmx小于可用物理内存,并配置-XX:OnOutOfMemoryError="kill -9 %p"应急脚本。