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

Pra*_*mar 10 java heap

请告诉我这些选项的目的.谷歌搜索之后我认为:MinHeapFreeRatio告诉"在GC之后将确保指定的最小空间百分比在堆内存中释放"并且MaxHeapFreeRatio告诉"在GC之后不超过指定的空间百分比将在堆内存中释放"[如果有是超出指定百分比的超出可用内存,那些内存将返回到OS]

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

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

注意:我刚刚尝试使用SerialGC,忽略了最小和最大堆自由比率选项.

Mar*_*tin 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
Run Code Online (Sandbox Code Playgroud)

使用这些选项,如果一代中的可用空间百分比低于 40%,则该代将扩展以保持 40% 的可用空间,直至该代允许的最大大小。同样,如果可用空间超过 70%,则世代会收缩,因此只有 70% 的空间是可用的,具体取决于世代的最小大小。

我将它与G1GC结合起来是这样的:

-XX:+UseG1GC -XX:MinHeapFreeRatio=2 -XX:MaxHeapFreeRatio=10
Run Code Online (Sandbox Code Playgroud)

得到这个结果:

随时间变化的堆大小以及所解释的参数


Pet*_*rey 2

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

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

  • 是的,彼得,我使用 VisualVM 检查了内存使用情况。我认为 ParallelGC 会忽略这些选项,它只是根据“暂停时间”和“吞吐量”目标动态调整年轻一代和老一代的大小。https://blogs.oracle.com/jonthecollector/entry/it_s_not_magic (2认同)