关于Java:在运行时设置JVM堆大小

Setting JVM heap size at runtime

有没有办法从正在运行的Java程序中设置堆大小?


没有。

对于具有非常多的堆要求的应用程序,您可以执行以下操作:使用-Xmx设置最大堆大小,并调整-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio,以使该应用程序在挂起时不会挂在大量内存上堆收缩(它使用默认设置进行收缩)。

但是请注意,当应用程序实际使用的内存变化剧烈且快速时,这可能会导致性能问题-在这种情况下,最好将其挂在所有内存上,而不是仅将其退还给操作系统以声明使用它再过一秒钟。您可能还想弄弄GC选项,以确保GC不会在周围留下过多的无人认领的对象,当堆有很大的增长空间时,GC往往会这样做,这会破坏目标希望堆大小适应应用程序的需求。


根据http://www.dreamincode.net/forums/showtopic96263.htm的说明,您无法在运行时执行此操作,但是可以生成另一个具有不同堆大小的进程。


您可以在启动应用程序时调整这些设置,但是一旦JVM启动并运行,就无法更改这些值。像这样:

java -Xms32m -Xmx512m FooBar

会将最小堆大小设置为32MB,将最大堆大小设置为512MB。一旦设置了它们,您将无法在正在运行的程序中对其进行更改。


确实确实可能存在这样的共识,但是我们应该查看JVM源代码,以了解如何进行人机工程学控制。能够让JVMTI代理能够在线/在运行时调整堆/ perm / tenured / new /&c大小将非常好。

这会怎么办?它将允许代理根据性能或占用空间目标来推断规模调整,这对于将JVM迁移到云中非常重要。


您可以在启动时使用-mx选项(也称为-Xmx)。这是您永远需要的最大大小,因为您不必将其设置为超过所需的最大大小。

但是,一种解决方法是让main()检查最大大小,如果最大大小不符合要求,则重新启动Java。即启动另一个Java程序并死亡。


我对自己问了同样的问题。与上面的答案不同,我可以对我的应用增加最大堆JVM大小进行处理。如果应用程序是群集模式下的Web服务器,则可以使用更改的最小/最大堆大小启动新实例,然后关闭初始实例。在GlassFish中,这将特别简单,在GlassFish中,您将管理实例与nodeAgent(应用服务器集群实例)JVM分开。

由于许多JVM应用程序都是Web应用程序,因此我认为值得在此博客中进行保留。


如果我正确理解您的问题,则您正在尝试在运行时更改堆大小。我看不出有什么可能的理由。使用-Xmx JVM选项在启动时设置堆大小。我还建议您仅在绝对需要时才设置-Xms选项。此选项设置分配给JVM的初始头内存量。

您应该知道应用程序在内存方面的表现。明智地设置-Xmx的值。如果您的应用程序是某种服务器应用程序,则可以设置更高的值,否则,您的选择会与客户端计算机上运行的其他可能的应用程序以及可用内存(当然是可用的)相抵触。