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=0MaxHeapFreeRatio=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

https://www.baeldung.com/gc-release-memory

https://juejin.cn/post/7225879698952470588

Views: 483 · Posted: 2023-12-22

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓
Today On History
Browsing Refresh