有没有办法从正在运行的Java程序中设置堆大小?
答案 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应用程序都是Web应用程序,因此我认为值得在此博客中保留。
答案 6 :(得分:-1)
如果我正确理解了您的问题,那么您正试图在运行时中更改堆大小。我认为没有任何理由可以做到这一点。使用-Xmx
JVM选项在启动中设置堆大小。我还建议您仅在必要时才设置-Xms
选项。此选项设置为JVM分配的初始内存量。
您应该知道应用程序在内存方面的行为方式。明智地设置-Xmx
的值。如果您的应用程序是某种服务器应用程序,您可以设置更高的值,否则会损害您在客户端计算机上运行的其他可能应用程序以及可用内存的选择。