【发布时间】:2010-10-20 06:46:52
【问题描述】:
有没有办法从正在运行的 Java 程序中设置堆大小?
【问题讨论】:
-
供参考,这里是热点的RFE:bugs.sun.com/bugdatabase/view_bug.do?bug_id=4408373
标签: java jvm runtime heap-memory
有没有办法从正在运行的 Java 程序中设置堆大小?
【问题讨论】:
标签: java jvm runtime heap-memory
根据http://www.dreamincode.net/forums/showtopic96263.htm,您不能在运行时执行此操作,但您可以生成具有不同堆大小的另一个进程。
【讨论】:
您可以在启动应用程序时调整这些设置,但是一旦 JVM 启动并运行,这些值就无法更改。像这样的:
java -Xms32m -Xmx512m FooBar
会将最小堆大小设置为 32MB,将最大堆大小设置为 512MB。一旦设置了这些,就不能在运行的程序中更改它们。
【讨论】:
没有。
对于堆要求非常多变的应用,您可以使用-Xmx 将最大堆大小设置得非常高,并调整-XX:MaxHeapFreeRatio 和-XX:MinHeapFreeRatio,这样应用就不会挂在很多堆收缩时的内存(它使用默认设置执行此操作)。
但请注意,当应用实际使用的内存变化剧烈且快速时,这可能会导致性能问题 - 在这种情况下,您最好将其挂在所有内存上,而不是仅将其返回给操作系统一秒钟后再次申领。您可能还想摆弄GC options 以确保 GC 不会留下太多无人认领的对象,当堆有很大的增长空间时,它往往会这样做,这会破坏目标希望堆大小适应应用程序的需求。
【讨论】:
如果我正确理解了您的问题,您正尝试在运行时 更改堆大小。我看不出有任何理由为什么这应该是可能的。使用-Xmx JVM 选项在启动 设置堆大小。我还建议您仅在绝对需要时设置-Xms 选项。此选项设置分配给 JVM 的初始头内存量。
您应该知道您的应用程序在内存方面的行为。明智地设置-Xmx 的值。如果您的应用程序是某种服务器应用程序,您可以设置一个更高的值,否则会在您的选择与在客户端计算机上运行的其他可能的应用程序以及当然可用内存之间妥协。
【讨论】:
大家的共识可能确实是这是不可能的,但我们应该查看 JVM 源代码,看看它是如何进行人体工程学控制的。如果 JVMTI 代理能够在线/在运行时调整堆/perm/tenured/new/&c 大小,那就太好了。
这会做什么?它将允许代理根据性能或占用空间目标推断大小调整,这在将 JVM 迁移到云中时非常重要。
【讨论】:
我问自己同样的问题。与上面的答案不同,我可以对 my 应用程序增加最大堆 JVM 大小做一些事情。如果应用程序是集群模式下的 Web 服务器,我可以启动一个更改了最小/最大堆大小的新实例,然后关闭初始实例。这在 GlassFish 中尤其简单,您将管理实例与 nodeAgent(应用服务器集群实例)JVM 分开。
由于许多 JVM 应用程序都是 Web 应用程序,我认为值得保留在此博客中。
【讨论】:
您可以在启动时使用 -mx 选项(也称为 -Xmx)这是您应该需要的最大尺寸,因为您不需要将其设置为大于您需要的最大大小。
但是,一种解决方法是让 main() 检查最大大小,如果最大大小不符合要求,则重新启动 java。即启动另一个 java 程序并死掉。
【讨论】: