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

2022-09-02 22:29:55

请告诉我这些选项的目的。在谷歌搜索之后,我认为:MinHeapFreeRatio告诉“在GC之后,指定的最小空间百分比将确保在堆内存中可用”,而MaxHeapFreeRatio告诉“在GC之后堆内存中可用的空间不超过指定百分比”[如果存在超过指定百分比的可用内存,这些内存将返回给操作系统]

当我尝试这些选项时,两者都有10作为值,即使有超过80%的可用堆内存,它也没有释放回操作系统。

详:

Java HotSpot(TM) 64 位服务器虚拟机 (1.5.0_15-b04, 混合模式) ParallelGC (也称为吞吐量收集器,它是服务器类 VM 中的默认收集器) 我指定了 -Xms50M 和 -Xmx1000M 作为 jvm 参数 操作系统: windows 7 专业版 (8 GB 内存 64 位操作系统)

注意:我刚刚也尝试了SerialGC,那些最小和最大无堆比率选项被忽略了。


答案 1

参数 -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

有了这个结果:

Heap size over time with the explained parammeters


答案 2

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

一般来说,随着时间的推移,应用程序使用的内存更多,而不是更少。你确定你的记忆是如此有限,以至于你需要这个吗?您是否确定您正在检查驻留内存而不是虚拟内存大小,在您的情况下,虚拟内存大小将始终约为1.2 GB。


推荐