在运行时设置JVM堆大小
有没有办法从正在运行的Java程序设置堆大小?
没有。
你可以用一个具有非常多variables堆的应用程序来做什么,就是使用-Xmx
和tune -XX:MaxHeapFreeRatio
和-XX:MinHeapFreeRatio
来设置你的最大堆大小,这样应用程序就不会挂在大量的内存上堆缩小(它使用默认设置)。
但是请注意,当应用程序实际使用的内存变化非常快时,这可能会导致性能问题 – 在这种情况下,您最好将它挂在所有内存上,而不是仅仅将其返回给操作系统来声明再过一秒钟。 您可能还想要摆脱GC的选项,以确保GC不会留下太多无人认领的物体,而这些物体往往会在有足够的空间堆成长的时候进行,而这会破坏希望堆大小适应应用程序的需求。
根据http://www.dreamincode.net/forums/showtopic96263.htm ,你不能在运行时做到这一点,但你可以用不同的堆大小产生另一个进程。
您可以在启动应用程序时调整这些设置,但是一旦JVM启动并运行,这些值就无法更改。 像这样的东西:
java -Xms32m -Xmx512m FooBar
将最小堆大小设置为32MB,最大堆大小设置为512MB。 一旦这些被设置,你就不能在正在运行的程序中改变它们。
这个共识确实可能是不可能的,但是我们应该看JVM的来源,看看它是如何被人体工程学控制的。 能够让JVMTI代理能够在运行时在线/调整heap / perm / tenured / new /&s尺寸是非常好的。
这会做什么? 它将允许代理根据性能或占用空间目标来推断resize的调整,这在将JVM移动到云中时非常重要。
您可以在启动时使用-mx选项(也称为-Xmx )。这是您所需要的最大大小,因此您不需要将其设置为超过您所需的最大大小。
但是,解决方法是让main()检查最大大小,并在最大大小不符合要求时重新启动java。 即启动另一个Java程序并死亡。
java -Xmx500m
仅在启动时启动
我对自己提出了同样的问题。 和上面的答案不同的是,我可以对应用程序增加最大堆JVM的大小。 如果应用程序是集群模式下的Web服务器,则可以使用更改的最小/最大堆大小和closures初始实例来启动新实例。 在GlassFish中,您将pipe理实例与nodeAgent(应用服务器集群实例)JVM分开,这一点尤其简单。
由于许多JVM应用程序都是networking应用程序,所以我觉得在这个博客中值得保留。
如果我正确理解你的问题,你正试图在运行时改变堆大小。 我看不出有什么理由可以这样做。 使用-Xmx
JVM选项设置启动时的堆大小。 我还build议你只在绝对需要时才设置-Xms
选项。 此选项设置为JVM分配的最初头内存量。
你应该知道你的应用程序在内存方面的performance。 明智地设置-Xmx
的值。 如果你的应用程序是某种服务器应用程序,你可以设置一个更高的值,否则会损害你的select与其他可能的应用程序运行在客户端机器,当然可用的内存。