62

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

4

7 回答 7

63

不。

对于具有非常可变堆要求的应用程序,您可以将最大堆大小设置为非常高-Xmx并进行调整-XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio以便在堆缩小时应用程序不会挂起大量内存(它使用默认设置) )。

但请注意,当应用程序实际使用的内存变化剧烈且快速时,这可能会导致性能问题 - 在这种情况下,您最好将其挂在所有内存上,而不是将其归还给操作系统只是为了声明它一秒钟后再次。您可能还想摆弄GC 选项以确保 GC 不会留下太多无人认领的对象,当堆有很大的增长空间时,它往往会这样做,这会破坏目标希望堆大小适应应用程序的需求。

于 2009-04-18T11:23:13.587 回答
13

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

于 2009-04-18T11:17:32.960 回答
7

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

java -Xms32m -Xmx512m FooBar

将最小堆大小设置为 32MB,将最大堆大小设置为 512MB。一旦设置了这些,您就不能在正在运行的程序中更改它们。

于 2009-04-18T11:20:26.557 回答
2

共识可能确实是这是不可能的,但我们应该查看 JVM 源代码,看看它是如何进行人体工程学控制的。如果能够让 JVMTI 代理能够在线/在运行时调整堆/perm/tenured/new/&c 大小,那就太好了。

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

于 2009-10-29T23:12:18.860 回答
1

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

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

于 2010-01-25T20:54:02.983 回答
0

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

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

于 2010-01-25T19:25:11.563 回答
-1

如果我正确理解您的问题,您正在尝试在运行时更改堆大小。我看不出有任何理由为什么这应该是可能的。使用JVM 选项在启动时设置堆大小。-Xmx我还建议您-Xms仅在绝对需要时才设置该选项。此选项设置分配给 JVM 的初始头内存量。

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

于 2009-04-18T11:34:58.910 回答