我有一个Java应用程序,它在启动后的第一分钟内分配大量内存。然后再运行30分钟,但几乎不需要任何记忆。我想将未使用的内存返回给操作系统。
我分析了应用程序,它在第一分钟分配了大约200 MB。然后190 MB被垃圾收集,但该过程仍然挂起到200 MB,直到该过程终止。它永远不会向操作系统返回任何内存(在我的情况下是Linux),除了少量的MB。
如何强制JVM将未使用的内存返回给操作系统?
有几个人已经在stackoverflow问了同样的问题。通常的答案是使用JVM选项-XX:MinHeapFreeRatio=x
和-XX:MaxHeapFreeRatio=y
。我尝试了几种不同的价值组合,但没有区别。
这就是这些选项的工作原理,正如我所理解的:如果垃圾收集后有超过MaxHeapFreeRatio的可用内存,JVM 可能将内存返回给操作系统。出于某种原因,我的JVM似乎不想这样做。我尝试了不同的垃圾收集器(-XX:+UseParallelGC
等)但没有成功。
答案 0 :(得分:1)
你不能强制 JVM来回馈内存。这些设置是建议性的。
此外,您可能会发现JVM需要先执行一个或多个完整垃圾收集,然后才能确定它可以回馈内存。