有没有一种方法可以从运行中的Java程序中设置堆大小?
有没有一种方法可以从运行中的Java程序中设置堆大小?
第一点。
如果你使用的应用程序具有非常不同的堆需求,那么你可以使用 -Xmx
设置你的最大堆大小,并调整 -XX:MaxHeapFreeRatio
和 -XX:MinHeapFreeRatio
,这样当堆缩小时(默认情况下会这样做),应用程序将不会卡住很多内存。
但是请注意,当应用程序实际使用的内存变化强烈且迅速时,这可能会导致性能问题 - 在这种情况下,与其将内存归还给操作系统,然后在一秒钟后再次索取,你最好让它保留所有内存。你也可能需要调整GC选项,以确保GC不会留下太多未声明的对象,当堆有大量空间增长时,GC往往会这样做,这会破坏希望堆大小调整到应用程序需求的目标。
当你启动应用程序时,可以调整这些设置,但一旦JVM启动并运行,这些值就不能被更改。例如:
java -Xms32m -Xmx512m FooBar
将最小堆大小设置为32MB,最大堆大小设置为512MB。一旦设置了这些值,在运行程序时就无法更改。
大家普遍认为这是不可能的,但我们应该查看JVM源代码,看看如何进行人性化控制。如果能够让JVMTI代理在在线/运行时调整堆/永久代/老年代/新生代等大小,将非常方便。
这样做会有什么作用?它将允许代理根据性能或占用空间目标推断出大小调整,这在将JVM移入云端时非常重要。
在启动时,您可以使用-mx选项(也称为-Xmx)。这是您可能需要的最大大小,在这种情况下,您不应将其设置为超过您将来可能需要的最大大小。
但是,一种解决方法是让main()检查最大大小,并在最大大小不符合要求时重新启动Java。即启动另一个Java程序并退出。
我曾经问过自己同样的问题。与上面的答案不同,我可以做一些关于我的应用程序增加最大堆JVM大小的事情。如果应用程序是集群模式下的Web服务器,我可以启动一个具有更改的最小/最大堆大小的新实例,然后关闭初始实例。在GlassFish中,这应该特别简单,因为您可以将管理实例与nodeAgent(应用程序服务器集群实例)JVM分开。
由于许多JVM应用程序都是Web应用程序,我认为值得在此博客中保留。
如果我理解你的问题正确,你正在尝试在运行时更改堆大小。我不认为这是可能的。使用-Xmx
JVM选项在启动时设置堆大小。我还建议您仅在绝对需要时设置-Xms
选项。此选项设置为JVM分配的初始头内存量。
您应该了解您的应用程序在内存方面的行为。明智地设置-Xmx
的值。如果您的应用程序是某种服务器应用程序,则可以设置较高的值,否则请将您的选择与其他可能在客户端机器上运行的应用程序以及可用内存妥协。