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
。
# 调整G1
的IHOP(InitiatingHeapOccupancyPercent)
即触发并发周期的堆占用百分比。默认是45%,如果老年代占用增长快,可能需要降低这个值,让G1更早开始并发标记,避免堆被占满。
例如:-XX:InitiatingHeapOccupancyPercent=35
。
# 控制晋升到老年代的GC次数
通过-XX:MaxTenuringThreshold
和-XX:TargetSurvivorRatio
设置,例如:-XX:MaxTenuringThreshold=20
和-XX:TargetSurvivorRatio=80
,默认是15和80%,即对象晋升到老年代的次数达到15次或者Survivor
区的存活对象占比超过80%时,会晋升到老年代。
# 控制G1
的Mixed GC
的阈值
Mixed GC
是指在Young GC
和Full GC
之间的一种混合模式,通过-XX:G1MixedGCLiveThresholdPercent
设置,例如:-XX:G1MixedGCLiveThresholdPercent=65
,默认是65%,即当Region
中存活对象占比超过65%时,会触发Mixed GC
。
# 控制G1
的Full 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
2
3
4