从JVM内部修改JVM args

时间:2009-02-05 03:55:45

标签: java jvm vmargs

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

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

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

7 个答案:

答案 0 :(得分:6)

这是一个半途而废的,彻头彻尾的黑客思想:

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

答案 1 :(得分:3)

您无法仅仅因为它会危及系统的安全性而更改这些选项。

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

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

答案 2 :(得分:2)

  

具体来说,我希望能够   更改的最大堆大小   jvm来自它的内部。这是   可能的?

没有

答案 3 :(得分:2)

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

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

有关详细信息,请参阅JMAPI

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

动态设置-Xmx对于长时间运行的运行时控制预计的系统资源(主要是足迹)非常有用。当然,其中一个分支是更大/更长的GC开销。

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