Setting JVM heap size at runtime
有没有办法从正在运行的Java程序中设置堆大小?
-
供参考,以下是热点的RFE:bugs.sun.com/bugdatabase/view_bug.do?bug_id=4408373
没有。
对于具有非常多的堆要求的应用程序,您可以执行以下操作:使用-Xmx设置最大堆大小,并调整-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio,以使该应用程序在挂起时不会挂在大量内存上堆收缩(它使用默认设置进行收缩)。
但是请注意,当应用程序实际使用的内存变化剧烈且快速时,这可能会导致性能问题-在这种情况下,最好将其挂在所有内存上,而不是仅将其退还给操作系统以声明使用它再过一秒钟。您可能还想弄弄GC选项,以确保GC不会在周围留下过多的无人认领的对象,当堆有很大的增长空间时,GC往往会这样做,这会破坏目标希望堆大小适应应用程序的需求。
-
-XX:MaxHeapFreeRatio的缺省值为70。空闲比率是未在堆上分配的空间量占堆总大小的比例。如果可用空间百分比增加到默认值70%以上,jvm将减小堆的大小,以允许OS使用内存。
-
这是可能的(而且我做了很多),但是问题是内存使用量可能会上下波动很多。它与实际的活动对象集不成比例,只是连续创建许多对象可能会导致堆爆炸。仅当您手动导致GC时,它才会下降。因此,您基本上必须在实际RAM中保留最大数量。我们确实需要一个选项来动态更改最大堆大小。
根据http://www.dreamincode.net/forums/showtopic96263.htm的说明,您无法在运行时执行此操作,但是可以生成另一个具有不同堆大小的进程。
-
也称为背面的巨大疼痛。如果您使用大量内存,那么您最后要做的就是释放所有内存,然后在另一个进程中重新加载它。当然,您不能将旧进程打开足够长的时间来传输数据,因为您仅用2个进程就占用了更多的内存来进行传输。希望您这次猜对了,还是希望自己再做一次。
您可以在启动应用程序时调整这些设置,但是一旦JVM启动并运行,就无法更改这些值。像这样:
java -Xms32m -Xmx512m FooBar
会将最小堆大小设置为32MB,将最大堆大小设置为512MB。一旦设置了它们,您将无法在正在运行的程序中对其进行更改。
确实确实可能存在这样的共识,但是我们应该查看JVM源代码,以了解如何进行人机工程学控制。能够让JVMTI代理能够在线/在运行时调整堆/ perm / tenured / new /&c大小将非常好。
这会怎么办?它将允许代理根据性能或占用空间目标来推断规模调整,这对于将JVM迁移到云中非常重要。
您可以在启动时使用-mx选项(也称为-Xmx)。这是您永远需要的最大大小,因为您不必将其设置为超过所需的最大大小。
但是,一种解决方法是让main()检查最大大小,如果最大大小不符合要求,则重新启动Java。即启动另一个Java程序并死亡。
-
这是假设您事先知道需要多少内存。这对于网络服务器/其他流媒体服务来说很好,但是如果您要分析数据(例如建立索引/寻找趋势),则需要预先知道数据将是什么,这是非常有限的
-
@Basic您不需要知道需要多少内存。 -Xmx是JVM可以具有的最大容量,即程序应因OutOfMemoryError崩溃而不是使用更多内存。此最大值通常基于您拥有的内存量,默认值为主内存的1/4。 JVM不会为" hello world"程序使用大量内存,无论您将最大值设置为什么。
-
假设您有一个进程并预先为其提供了50 gig的内存,并且在运行期间注意到很多GC正在运行,那可能是56 GiB会更好,并且如果不进行大量重新计算就无法轻松重启程序...
-
@kap,因此最好将最大值设置为您希望程序失败而不是继续运行的级别。
我对自己问了同样的问题。与上面的答案不同,我可以对我的应用增加最大堆JVM大小进行处理。如果应用程序是群集模式下的Web服务器,则可以使用更改的最小/最大堆大小启动新实例,然后关闭初始实例。在GlassFish中,这将特别简单,在GlassFish中,您将管理实例与nodeAgent(应用服务器集群实例)JVM分开。
由于许多JVM应用程序都是Web应用程序,因此我认为值得在此博客中进行保留。
如果我正确理解您的问题,则您正在尝试在运行时更改堆大小。我看不出有什么可能的理由。使用-Xmx JVM选项在启动时设置堆大小。我还建议您仅在绝对需要时才设置-Xms选项。此选项设置分配给JVM的初始头内存量。
您应该知道应用程序在内存方面的表现。明智地设置-Xmx的值。如果您的应用程序是某种服务器应用程序,则可以设置更高的值,否则,您的选择会与客户端计算机上运行的其他可能的应用程序以及可用内存(当然是可用的)相抵触。
-
明智地设置值...是的,这是个很好的建议。但是考虑这种情况-您正在观察如何使应用程序接近堆的最大值,而对此却无能为力。是的,代码中存在泄漏……但是首先我们需要在白天保持生命,然后我们将解决问题
-
另请注意,这可能是您无法控制VM启动设置的applet或其他类型的应用程序。在某些情况下,这会很好。我认为主要问题是,如果您能够进行更改,则可能会遇到与安全性有关的内存问题。