在运行时设置JVM堆大小

时间:2009-04-18 11:13:48

标签: java jvm runtime heap

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

7 个答案:

答案 0 :(得分:59)

没有。

使用具有非常可变的堆要求的应用程序,您可以使用-Xmx设置最大堆大小并调整-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio,以便应用程序不会当堆缩小时,它会占用大量内存(使用默认设置时会这样做)。

但请注意,当应用程序实际使用的内存强烈且快速地变化时,这可能会导致性能问题 - 在这种情况下,最好将其挂在所有内存上,而不是仅将其恢复到操作系统一秒钟之后再次申请。您可能还想摆弄GC options以确保GC不会留下太多无人认领的物体,当堆有很大的空间来生长时,它往往会这样做,而这会失败希望堆大小适应应用程序需求的目标。

答案 1 :(得分:13)

根据http://www.dreamincode.net/forums/showtopic96263.htm,您不能在运行时执行此操作,但可以使用不同的堆大小生成另一个进程。

答案 2 :(得分:7)

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

  

java -Xms32m -Xmx512m FooBar

将最小堆大小设置为32MB,最大堆大小设置为512MB。设置完成后,您无法在正在运行的程序中更改它们。

答案 3 :(得分:2)

可能确实存在共识,这是不可能的,但我们应该查看JVM源,看看它是如何符合人体工程学的。能够让JVMTI代理能够在运行时调整堆/ perm / tenured / new /& c大小调整,这将是非常好的。

这会怎么做?它允许代理根据性能或占用空间目标推断调整大小调整,这在将JVM移动到云中时非常重要。

答案 4 :(得分:2)

您可以在启动时使用 -mx 选项(也称为 -Xmx )这是您应该需要的最大尺寸,因为您不需要将它设置为超过您需要的最大尺寸。

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

答案 5 :(得分:0)

我告诉自己同样的问题。与上面的答案不同,我可以做一些关于增加最大堆JVM大小的我的应用程序。如果app是集群模式下的Web服务器,我可以启动一个更新的最小/最大堆大小而不是关闭初始实例的新实例。在GlassFish中,这一点应该特别简单,其中您将管理实例与nodeAgent(app server clustered instance)JVM分开。

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

答案 6 :(得分:-1)

如果我正确理解了您的问题,那么您正试图在运行时中更改堆大小。我认为没有任何理由可以做到这一点。使用-Xmx JVM选项在启动中设置堆大小。我还建议您仅在必要时才设置-Xms选项。此选项设置为JVM分配的初始内存量。

您应该知道应用程序在内存方面的行为方式。明智地设置-Xmx的值。如果您的应用程序是某种服务器应用程序,您可以设置更高的值,否则会损害您在客户端计算机上运行的其他可能应用程序以及可用内存的选择。