G1垃圾收集器的参数调优

# 可优化方向

# 调整G1的Region大小

默认情况下,G1 堆区域的大小并不是固定的数值,而是由 JVM 根据整个堆的大小动态计算的。JVM 会尝试将整个堆划分为大约 2048 个区域,这样的区域大小会在 1MB 到 32MB 之间取一个 2 的幂。 通过-XX:G1HeapRegionSize设置,例如:-XX:G1HeapRegionSize=16M,可以调整Region的大小,一般建议设置为1M~32M之间,过大会导致Region数量减少,过小会导致Region数量增多,影响GC效率。

但一般自动调整可能更合适,除非有特殊需求。

# 调整MaxGCPauseMillis

默认是200ms,如果应用对延迟敏感,可以降低这个值,让G1更积极地回收,可能减少堆占用。

例如:-XX:MaxGCPauseMillis=100

# 调整G1IHOP(InitiatingHeapOccupancyPercent)

即触发并发周期的堆占用百分比。默认是45%,如果老年代占用增长快,可能需要降低这个值,让G1更早开始并发标记,避免堆被占满。

例如:-XX:InitiatingHeapOccupancyPercent=35

# 控制晋升到老年代的GC次数

通过-XX:MaxTenuringThreshold-XX:TargetSurvivorRatio设置,例如:-XX:MaxTenuringThreshold=20-XX:TargetSurvivorRatio=80,默认是15和80%,即对象晋升到老年代的次数达到15次或者Survivor区的存活对象占比超过80%时,会晋升到老年代。

# 控制G1Mixed GC的阈值

Mixed GC是指在Young GCFull GC之间的一种混合模式,通过-XX:G1MixedGCLiveThresholdPercent设置,例如:-XX:G1MixedGCLiveThresholdPercent=65,默认是65%,即当Region中存活对象占比超过65%时,会触发Mixed GC

# 控制G1Full GC的阈值

通过-XX:InitiatingHeapOccupancyPercent设置,例如:-XX:InitiatingHeapOccupancyPercent=45,默认是45%,即当堆占用达到45%时,会触发Full GC

# 调整Metaspace大小

G1使用Metaspace来存储类元数据,可以通过-XX:MetaspaceSize-XX:MaxMetaspaceSize设置Metaspace的大小。

# 限制年轻代动态扩容范围

通过-XX:G1NewSizePercent-XX:G1MaxNewSizePercent设置,例如:-XX:G1NewSizePercent=20-XX:G1MaxNewSizePercent=60,默认是5%和60%,即年轻代的大小在5%~60%之间动态调整。

# 调整堆扩展的激进程度

G1倾向于快速扩展堆以满足分配需求,通过调整-XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio控制扩展阈值:

# 当空闲堆内存低于20%时扩展(默认40%)
-XX:MinHeapFreeRatio=20  
# 当空闲堆内存高于50%时收缩(默认70%)
-XX:MaxHeapFreeRatio=50  
1
2
3
4
上次更新: 2025/02/27, 02:17:32
最近更新
01
内存占用过大排查
01-14
02
docker-compose笔记
01-12
03
MySQL数据迁移
11-27
更多文章>