【问题标题】:java increase xmx dynamically at runtimejava在运行时动态增加xmx
【发布时间】:2010-05-21 17:40:59
【问题描述】:

我的机器上有一个 jvm 服务器,现在我想让我的 2 个 apservers 坐在同一台机器上,但是我希望备用服务器分配给 xmx 的内存量非常低,因为它是被动的,一个是主要的服务器(主动)出现故障我想为我的被动服务器分配更多内存,该服务器已经启动而无需重新启动它(我让它们都有太多的 xmx - 请注意它们会在启动时消耗内存,我不能允许 outOfMemory 的可能性)。

所以我想要被动 - 低 xmx 一旦主动下降,我希望我的被动获得更多的 xmx。

有没有办法让我做到这一点。 谢谢

【问题讨论】:

    标签: java performance


    【解决方案1】:

    这很好,但据我所知,Sun 提供的 JVM 不支持此选项。

    Xmx 选项是指定最大内存,它的存在是为了防止 JVM 消耗整个机器的空闲内存。如果您想将其设置得更高,则不需要 JVM 分配所有内存。为什么不把它设置为一个非常高的数字,让 JVM 随着时间的推移而增长呢?

    为确保您的 JVM 启动时内存不会太少(在将内存增加到所需大小时会产生大量暂停),请将 Xms 调整为您希望在启动时为 JVM 分配的大小。

    【讨论】:

    • 它不需要 JVM 分配所有的内存。 - 我明白这一点,但是一旦我告诉 jvm XMX=somevalue,那么在我看来,JVM 允许 使用它,我什至不能让它需要它的最小机会(参见我的上一条评论)。
    • @Jas 我发现在实践中,JVM 会使用你告诉它使用的一切。即使你只有 10 MB 的硬引用对象,如果你给它 -Xmx100G,即使内存中的几乎所有对象都可以收集,它也会用完 100G。这就是他们让我们指定它的原因——因为他们不知道如何很好地管理内存以使其自动增长。
    【解决方案2】:

    简短的回答是,除非您的特定 JVM 允许在初始化后更改这些值,否则您不能(我相信 HotSpot 就是这种情况)。

    但是,您可以在不即时更改 Xmx 的情况下实现您的目标。例如,您可以使用较小的-Xms 设置,但保持-Xmx 相对较高。如果被动服务器在仍用作备份的同时没有使用太多内存/产生垃圾,那么内存将保持在Xms 值附近。但是,一旦备份服务器接管,它将被允许根据需要将分配的内存扩展到 Xmx 值。

    酌情参见java (windows)java (*nix)(尽管-Xms-Xmx 在所有平台上具有相同的一般含义)。

    【讨论】:

      【解决方案3】:

      您不需要在备用实例上调整 Xmx,只要它不做任何事情(或大部分事情),因为它应该保持接近您使用 Xms 设置的值,直到它开始真正工作。

      Xmx 开关控制 Java 实例可能消耗的最大堆大小。 Xms 控制启动量。

      如果您在备用实例上将 Xms 设置为小,并将 Xmx 设置为您的程序所需的任何最大值,然后切换到备用实例(终止常规实例),它应该可以正常工作。

      可能有必要根据您的可用内存实际停止/终止常规 Java 进程,以便备用进程在从最初的较小堆大小移动到最大值时分配它所需的所有堆。

      【讨论】:

      • 一旦我告诉 JVM XMX= 然后在我看来我无法控制它,我不能 100% jvm 不会使用内存,谁知道也许jvm 将在一段时间后决定它是否需要内存——毕竟我无法控制它,即使 jvm 有 1% 的机会决定它需要更多内存,我也不能允许任何机会——它在内部做很多事情,也许它会决定它需要更多而我的应用程序不需要更多,我的备用应用程序服务器有几个线程它不像一个完全冻结的应用程序......
      • 所以我担心的是,尽管我指定了高 XMX 并且它在某些时候处于备用状态,但备用状态会达到该内存只是因为 jvm 会决定它需要它(也许它有一些我不知道的算法)。
      • @Jason 只需使用您正在使用的特定 JVM 进行尝试。您可以运行一个外部监视器(请参阅 hyperic.org 以获得一个好的开源监视器)来跟踪 JVM 内存使用情况和许多其他统计信息。如果备用内存开始消耗更多内存,Hyperic 会提醒您。
      • 你也可以使用-XX:MaxHeapFreeRatio来说服JVM将未使用的堆释放回OS。
      【解决方案4】:

      要让 JVM 填满所有堆,您必须生成足够多的对象以在年轻代集合中存活。这在负载较轻的备用服务器上不太可能发生。

      为了提高在年轻代中捕获所有垃圾的机会,请相应地配置您的年轻代堆:更大的大小,在对象老化之前生成更多代。这是将备用服务器限制在年轻代和主服务器中所需的收集配置文件之间的折衷方案。

      更新:新的 G1 收集器使用不同的配置选项。请查看http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html 了解更多信息。与您的案例最相关的选项是

      -XX:InitiatingHeapOccupancyPercent=45 - 启动并发 GC 周期的(整个)堆占用百分比。 G1 使用它来触发基于整个堆的占用情况的并发 GC 周期,而不仅仅是一代。值 0 表示“执行恒定的 GC 循环”。默认值为 45(即 45% 已满或已占用)。

      IOW,相当于年轻代收集将在当前堆(最初的最小堆大小)用完 45% 时开始。您的轻负载服务器不应该离开最小堆大小(除非它产生相对长寿命的对象,在这种情况下,请参阅 -XX:MaxTenuringThreshold)。

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 2017-02-22
        • 2018-06-27
        • 2015-10-10
        • 1970-01-01
        • 2015-08-28
        • 2017-04-22
        • 1970-01-01
        • 2011-03-25
        相关资源
        最近更新 更多