【问题标题】:Modify JVM args from inside the JVM从 JVM 内部修改 JVM args
【发布时间】:2010-10-05 14:18:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jvm vmargs


    【解决方案1】:

    这是一个半途而废、完全不合时宜的黑客思想:

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

    【讨论】:

    • 你不需要从孩子那里杀死父母,一旦孩子运行,父母就可以杀死自己。
    • 鉴于要求,这不是一个不合理的解决方案。基本上编写一个引导应用程序来读取配置并启动“真正的”应用程序。
    • 你甚至可以使用 Terracotta。生成新的 VM - 使用 Terracotta 复制字段,然后终止父级。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      具体来说,我希望能够 更改最大堆大小 jvm 从它里面。这是 可能吗?

      没有。

      【讨论】:

        【解决方案4】:

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

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

        更多信息请见JMAPI

        【讨论】:

        • 根据我对 Javadoc 的阅读,这不允许您使堆大小大于最大堆大小 (-mx)。此外,它不适用于 Sun JVM。
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-06-05
              • 1970-01-01
              • 1970-01-01
              • 2012-02-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-10
              相关资源
              最近更新 更多