我有一个可以在我使用 jvm 命令时执行的应用程序-Xmx65m
。虽然它运行良好,但我想让应用程序消耗更多内存,因为它有一些需要它的功能。问题是,如果我增加该-Xmx
选项,JVM 将分配更多内存来运行它仅用 65 MB 就可以处理的功能。
是否可以将 JVM 配置为仅在 SO 用完选项并且即将抛出 OutOfMemoryError 时才向 SO 请求更多内存?
我有一个可以在我使用 jvm 命令时执行的应用程序-Xmx65m
。虽然它运行良好,但我想让应用程序消耗更多内存,因为它有一些需要它的功能。问题是,如果我增加该-Xmx
选项,JVM 将分配更多内存来运行它仅用 65 MB 就可以处理的功能。
是否可以将 JVM 配置为仅在 SO 用完选项并且即将抛出 OutOfMemoryError 时才向 SO 请求更多内存?
请添加 min , max 内存设置。这样 JVM 可以从所需的最小内存开始,并在需要时继续分配更多内存。
-Xms65m -Xmx512m
希望这可以帮助。
JVM 在启动时将最大堆大小保留为虚拟内存,但它只使用它需要的数量(即使您设置了最小大小,它也可能不会使用那么多)如果它使用大量内存但不需要它它可以再回馈给操作系统(但通常不会 AFAIK)
也许您没有看到逐渐增加,因为您的最大值是如此之小。尝试使用最大值-mx1g
并查看jvisualvm
最大堆大小如何增长。
是否可以将 JVM 配置为仅在 SO 用完选项并且即将抛出 OutOfMemoryError 时才向 SO 请求更多内存?
随着 JVM 接近最终耗尽空间,它运行 GC 的频率越来越高,应用程序吞吐量(就每 CPU 秒完成的有用工作而言)急剧下降。如果你能避免它,你不希望这种情况发生。
您可以使用一种 GC 调整选项来阻止 JVM 增大堆。该-XX:MinHeapFreeRatio
选项设置“GC 后堆空闲的最小百分比以避免扩展”。如果您将其从默认值 40% 降低到(例如)20%,GC 将不那么急于扩展堆。
不利的一面是,如果您减少-XX:MinHeapFreeRatio
,整个 JVM 将花费更大比例的时间来运行垃圾收集器。走得太远,影响可能会非常严重。(就个人而言,我根本不建议更改此设置...)