-XX:MinHeapFreeRatio和-XX:MaxHeapFreeRatio的目的是什么?

22
请告诉我这些选项的目的。 经过谷歌搜索,我认为: MinHeapFreeRatio是指“在GC后,确保堆内存中有特定百分比的空间可用于释放”; 而MaxHeapFreeRatio是指“在GC后,堆内存中不得超过特定百分比的空间可用于释放”[如果存在超出指定百分比的空闲内存,则将其返回给操作系统]。
当我将这些选项的值都设为10时,即使有超过80%的空闲堆内存,它也没有被释放回操作系统。
详细信息: Java HotSpot(TM) 64-Bit Server VM (1.5.0_15-b04, mixed mode) ParallelGC(也称为吞吐量收集器,它是服务器类VM中默认的收集器) 我指定了-Xms50M和-Xmx1000M作为JVM参数 操作系统:Windows 7 Professional(8GB内存64位操作系统)
注:我还尝试了SerialGC,但那些最小和最大堆空闲比例选项被忽略了。

1
我猜它是设置一个百分比范围,对吧?不应该都设为10,而是设置像MinHeapFreeRatio=10MaxHeapFreeRatio=90 这样的值,希望我的理解是正确的。 - Eric
2个回答

14

-XX:MinHeapFreeRatio和-XX:MaxHeapFreeRatio参数的最佳解释可以在Oracle垃圾文档中找到:

https://docs.oracle.com/javase/10/gctuning/factors-affecting-garbage-collection-performance.htm

-XX:MinHeapFreeRatio=40
-XX:MaxHeapFreeRatio=70
如果一代中的可用空间百分比下降到40%以下,则会扩展该代以保持40%的可用空间,直至达到允许的最大代大小。同样,如果空闲空间超过70%,则会收缩该代,使只有70%的空间是空闲的,但仍要考虑该代的最小大小。我将其与G1GC结合使用的方式如下:
-XX:+UseG1GC -XX:MinHeapFreeRatio=2 -XX:MaxHeapFreeRatio=10

根据这个结果:

使用解释参数后的堆大小随时间变化图


嗨,马丁,你在截图中使用的是什么程序?我正在开始接触JVM这个深奥的世界,这种工具看起来非常有用。谢谢。 - JaiMartz
嗨@JaiMartz,你有很多程序可以使用:Java任务控制、Eclipse内存分析器或VisualVM(用于此截图)。 - Martin

2

Java很少将内存释放回操作系统。

一般来说,应用程序随时间使用的内存越来越多而不是减少。您确定您的内存非常有限,需要这样做吗?您确定您正在检查常驻内存而不是虚拟内存大小,在您的情况下始终为约1.2 GB。


2
是的,彼得,我使用VisualVM检查了内存使用情况。我认为ParallelGC将忽略这些选项,它只会根据“暂停时间”和“吞吐量”目标动态调整年轻代和老年代的大小。 https://blogs.oracle.com/jonthecollector/entry/it_s_not_magic - Praveen Kumar
@PraveenKumar,你能确认并行收集器是否忽略了MinHeapRatioMaxHeapRatio吗? - Chetan Yewale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接