如何配置JVM只在真正需要时分配内存?

时间:2012-10-22 11:24:51

标签: java memory-management jvm jvm-arguments

我有一个可以在使用jvm命令-Xmx65m时执行的应用程序。虽然它运行正常,但我希望允许应用程序消耗更多内存,因为它具有一些需要它的功能。问题是,如果我增加-Xmx选项,JVM将分配更多内存来运行它只能处理65 MB的功能。

是否可以将JVM配置为仅在SO耗尽时才向SO请求更多内存并且它将要抛出OutOfMemoryError?

3 个答案:

答案 0 :(得分:3)

请添加最小,最大内存设置。因此,JVM可以从最小所需内存开始,并在需要时保持分配更多内存。

-Xms65m -Xmx512m

希望这有帮助。

答案 1 :(得分:2)

JVM在启动时保留最大堆大小作为虚拟内存,但它只使用它所需的数量(即使你设置了它可能不会使用那么多的最小大小)如果它使用大量内存但是没有不再需要它可以回馈操作系统(但通常不是AFAIK)

也许你没有看到逐渐增加,因为你的最大值是如此之小。尝试最多-mx1g,并查看jvisualvm最大堆大小的增长情况。

答案 2 :(得分:1)

  

是否可以将JVM配置为仅在SO耗尽时才向SO请求更多内存并且它将要抛出OutOfMemoryError?

随着JVM接近最终耗尽空间,它越来越频繁地运行GC,并且应用程序吞吐量(就每秒CPU执行的有用工作而言)急剧下降。如果你能避免这种情况,你不希望发生这种情况。

您可以使用一个GC调整选项来阻止JVM扩展堆。 -XX:MinHeapFreeRatio选项设置“GC之后的最小堆空闲百分比以避免扩展”。如果将此值从默认值40%降低到(比方说)20%,GC将不太愿意扩展堆。

缺点是,如果减少-XX:MinHeapFreeRatio,整个JVM将花费更多的时间来运行垃圾收集器。走得太远,效果可能会非常严重。 (就个人而言,我不建议完全改变这个设置......)