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:500MUsed:400MFree:100M
默认:-XX:MinHeapFreeRatio=40.0,即0.4。
计算:FreeRatio等于100/500=0.2。
结论:0.2<0.4(MinHeapFreeRatio) 要扩容。
场景二
Total:500MUsed:100MFree:400M
默认:-XX:MaxHeapFreeRatio=70.0,即0.7。
计算:FreeRatio等于400/500=0.8。
结论:0.8>0.7(MaxHeapFreeRatio) 要缩容。
场景三
Total:500MUsed:400MFree: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扫描下方二维码关注公众号和小程序↓↓↓