3

有没有办法从 jvm 内部修改 jvm args?具体来说,我希望能够从其中更改 jvm 的最大堆大小。这可能吗?

编辑:我想我应该添加我想这样做的原因。我有一些在不同机器/平台上运行的 Java 程序。这些程序具有在运行时获取的配置,并且根据程序运行的机器/环境而有所不同。其中一些配置可以在运行时更改,并且各种程序会随着配置的更改而自动更新。

我希望堆大小是这些配置参数之一,它像配置的其余部分一样在运行时获取。如果是这样,那么程序可以启动(使用一些默认的 jvm args)然后根据检索到的配置进行自我调整。

4

7 回答 7

6

这是一个半认真的,完全不合时宜的黑客思想:

...如果您从当前 jvm 生成一个新的 java 实例(使用新设置)然后从新的 jvm 中杀死旧进程怎么办?我不知道这是否有帮助(甚至工作)......

于 2009-02-05T04:08:05.053 回答
3

您不能仅仅因为它损害系统的安全性而更改这些选项。

如果管理员希望通过设置安全管理器仅允许某个程序具有某些功能,如果您可以将其关闭,那将是一个严重的问题。

无论如何,一个程序不应该在运行时改变它的内存需求——这些东西应该由管理员知道和设置。您的程序没有理由需要在运行时执行此操作。如果它真的需要改变这一点,也许原因是为什么管理员类型的家伙不这样做?

于 2009-02-05T04:13:48.273 回答
2

使用JRockit,您至少可以建议堆大小。

JVMFactory.getJVM().getMemorySystem().suggestHeapSize(100*1000*1000);

有关更多信息,请参阅JMAPI

于 2009-02-10T01:51:22.450 回答
2

具体来说,我希望能够从其中更改 jvm 的最大堆大小。这可能吗?

不。

于 2009-02-05T04:03:16.937 回答
1

(多年后),我找到了一个库,可以完成我发布时所需的内容。 Akuma是一个用于守护 Java 进程的库。它允许使用新参数重新启动 JVM。

使用它与使用引导程序启动新进程之间的区别在于标准输入/标准输出和其他文件描述符是自动共享的。

于 2014-06-06T17:18:22.137 回答
0

例如,动态设置 -Xmx 对于控制长期运行的运行时的预计系统资源(主要是占用空间)非常有帮助。当然,许多后果之一是更大/更长的 GC 开销。

我知道有几台大型服务器机器运行着几十个 1G+ 堆 JVM。如果这些运行时可以在低使用时间缩减其高水位线,那么您可以更好地管理您的系统资源。

于 2009-10-30T22:20:26.767 回答
0

正如其他人所指出的,这通常只有通过引导程序(Java 或其他语言)才能使用正确的参数调用主 JVM。

也就是说,你确定这是必要的吗?您提到“最大堆大小”。如果您指的是 -Xmx 参数:这只是 VM 永远不会超过的限制。这并不意味着虚拟机真的会使用那么多,如果可以的话,它会用更少的。

因此,您始终可以将 -Xmx 设置为系统可以处理的最大值,并让 JVM 决定它真正需要多少。为什么你认为你需要动态设置它?

于 2009-04-15T09:09:50.907 回答