0

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

是否可以将 JVM 配置为仅在 SO 用完选项并且即将抛出 OutOfMemoryError 时才向 SO 请求更多内存?

4

3 回答 3

3

请添加 min , max 内存设置。这样 JVM 可以从所需的最小内存开始,并在需要时继续分配更多内存。

-Xms65m -Xmx512m

希望这可以帮助。

于 2012-10-22T11:29:55.083 回答
2

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

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

于 2012-10-22T11:28:05.037 回答
1

是否可以将 JVM 配置为仅在 SO 用完选项并且即将抛出 OutOfMemoryError 时才向 SO 请求更多内存?

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

您可以使用一种 GC 调整选项来阻止 JVM 增大堆。该-XX:MinHeapFreeRatio选项设置“GC 后堆空闲的最小百分比以避免扩展”。如果您将其从默认值 40% 降低到(例如)20%,GC 将不那么急于扩展堆。

不利的一面是,如果您减少-XX:MinHeapFreeRatio,整个 JVM 将花费更大比例的时间来运行垃圾收集器。走得太远,影响可能会非常严重。(就个人而言,我根本不建议更改此设置...)

于 2012-10-22T13:47:41.483 回答