优化jvm垃圾回收需根据吞吐、延迟、内存占用三者权衡:批处理用parallel gc(-xx:+useparallelgc),web服务选g1(-xx:+useg1gc -xx:maxgcpausemillis=200),超低延迟场景用zgc(-xx:+usezgc),小内存用serial gc(-xx:+useserialgc);堆大小应固定(-xms4g -xmx4g),新生代独立指定(-xmn1.5g),survivor比例合理(-xx:survivorratio=8),元空间需限制(-xx:metaspacesize=256m -xx:maxmetaspacesize=512m);必须开启gc日志(-xlog:gc*:file=...)并监控ygc频率、full gc次数与停顿时间;避开swap、透明大页、过大线程栈等常见陷阱。

优化 JVM 垃圾回收的运行环境配置,核心是让 GC 行为匹配应用的实际负载特征——不是堆越大越好,也不是停顿越短越优,而是根据吞吐、延迟、内存占用这三者的权衡来精准设定。
明确目标再选回收器
不同回收器解决的问题完全不同:
- 批处理、后台计算类应用(如定时报表生成):优先用 Parallel Scavenge + Parallel Old,参数加
-XX:+UseParallelGC,它不追求单次停顿短,但单位时间完成更多有效工作; - Web API、实时交易等对响应敏感的服务:选 G1(堆 ≥ 4GB 时效果明显),启用
-XX:+UseG1GC,再设-XX:MaxGCPauseMillis=200(目标值,非硬上限); - 超低延迟要求(如高频交易、游戏服务器)且 JDK ≥ 11:考虑 ZGC 或 Shenandoah,用
-XX:+UseZGC,停顿基本稳定在 10ms 内,但需注意其对 NUMA 架构和大页内存的支持; - 小内存(≤ 2GB)、单核或嵌入式场景:Serial GC 反而更稳,开销最小,参数为
-XX:+UseSerialGC。
堆与分代参数要“定”且“准”
避免 JVM 自己“猜”内存分配,所有关键大小都应显式固定:
-
堆大小统一:
-Xms4g -Xmx4g(例如),防止扩容缩容引发额外 GC 和卡顿;生产环境最大堆建议不超过物理内存的 50%,留足系统缓存空间; -
新生代独立指定:比用
-XX:NewRatio更直接,例如-Xmn1.5g(占总堆约 3/8),适合对象生命周期短、创建频繁的服务; -
Survivor 区比例合理:默认
-XX:SurvivorRatio=8(Eden : S0 : S1 = 8:1:1),若发现大量对象过早晋升老年代,可调小该值(如设为 4),扩大 Survivor 容量,延长对象在年轻代存活时间; -
元空间别放任自流:动态加载类多的应用(如 Spring Boot + 大量 starter),必须设
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m,防元空间无限增长触发 Full GC。
日志与监控必须上线
没有日志的调优等于盲调:
- 开启详细 GC 日志:
-Xlog:gc*:file=/var/log/myapp/gc.log:time,uptime,level,tags -Xlog:safepoint -Xlog:gc+heap=debug(JDK 11+ 推荐写法); - 关键看三项:YGC 频率(是否太密?说明新生代太小或对象存活率高)、Full GC 次数(是否持续上升?提示内存泄漏或老年代过小)、平均停顿时间(是否突破 SLA?需换回收器或调参);
- 搭配
jstat -gc -h10 <pid> 5s</pid>实时观察各区域使用率变化趋势,比单次快照更有价值; - 用 GCEasy 或 GCViewer 解析日志,自动标出异常点(如连续多次 Promotion Failure、Humongous Allocation 失败)。
避开常见陷阱
很多性能问题其实和 GC 本身无关,而是配置或代码引发的连锁反应:
-
禁用内存交换(swap):Linux 上执行
swapoff -a,否则 GC 过程中一旦触发 swap,停顿会飙升至秒级; -
关闭透明大页(THP):CentOS/RHEL 默认开启,会导致 G1/ZGC 性能下降,运行
echo never > /sys/kernel/mm/transparent_hugepage/enabled; -
线程栈别设太大:
-Xss256k通常足够,设成 1M 会让每个线程多占近 1MB 内存,在高并发下迅速吃光堆外内存; - 避免过度复用对象池:现代 JVM 对象分配极快,盲目用 Apache Commons Pool 等反而增加 GC 压力和复杂度,除非对象创建成本确实极高(如 SSLContext)。











