Java 堆内存动态调整
Java JVM About 1,509 words参数
JVM
中参数MaxHeapFreeRatio
,默认值70
,表示空闲的堆内存占最大内存(-Xmx
)的比例大于设置的比例(-XX:MaxHeapFreeRatio
)时,JVM
会减少堆直到-Xms
的最小限制。
JVM
中参数MinHeapFreeRatio
,默认值40
,表示空闲的堆内存占最大内存(-Xmx
)的比例小于设置的比例(-XX:MinHeapFreeRatio
)时,JVM
会增加堆直到-Xmx
的最大限制。
-XX:MaxHeapFreeRatio=70.0
-XX:MinHeapFreeRatio=40.0
空闲堆内存比例计算公示:
HeapFreeRatio = (CurrentFreeHeapSize/CurrentTotalHeapSize) * 100
结论:
HeapFreeRatio
> MaxHeapFreeRatio
,则需要进行堆缩容,缩容的时机应该在每次垃圾回收之后。
HeapFreeRatio
< MinHeapFreeRatio
,则需要进行堆扩容,扩容的时机应该在每次垃圾回收之后。
适用 GC
SerialGC
: 仅作用于老年代。触发FullGC
后开始调整。
ParallelGC
: 默认MinHeapFreeRatio=0
,MaxHeapFreeRatio=100
,即不动态调整。
G1GC
: 作用于整个堆,触发老年代GC
时开始调整,通过增加或者减少Region
数量进行伸缩。
ShenandoahGC
: 不生效。
ZGC
: 不生效。
场景一
Total
:500M
Used
:400M
Free
:100M
默认:-XX:MinHeapFreeRatio=40.0
,即0.4
。
计算:FreeRatio
等于100/500=0.2
。
结论:0.2<0.4
(MinHeapFreeRatio
) 要扩容。
场景二
Total
:500M
Used
:100M
Free
:400M
默认:-XX:MaxHeapFreeRatio=70.0
,即0.7
。
计算:FreeRatio
等于400/500=0.8
。
结论:0.8>0.7
(MaxHeapFreeRatio
) 要缩容。
场景三
Total
:500M
Used
:400M
Free
:100M
设置:-XX:MaxHeapFreeRatio=10.0
,即0.1
。
计算:FreeRatio
等于100/500=0.2
。
结论:0.2>0.1
(MaxHeapFreeRatio
) 要缩容。
ShrinkHeapInSteps
是否分步扩容或缩容。默认是true
。
-XX:-ShrinkHeapInSteps
表示关闭分步伸缩,一步到位。
说明
为了堆的稳定性,一般不需要动态调整堆内存大小,把-Xms
和-Xmx
设置为相同的数值就可以固定堆内存大小,不做动态调整。
如果对于小内存环境的需求,可以设置该值,实现uncommit
的内存归还系统的目的。
Java 12
开始G1
支持uncommit
内存归还给系统,以实现堆内存动态调整。
文档
JEP 346: Promptly Return Unused Committed Memory from G1
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓