代码之家  ›  专栏  ›  技术社区  ›  Jas

Java在运行时动态增加XMX

  •  7
  • Jas  · 技术社区  · 14 年前

    我的机器里有一台JVM服务器,现在我想让两台服务器坐在同一台机器上,但是我想让备用服务器的XMX分配的内存量非常低,因为它是被动的,主服务器(主动的)一个坏掉了,我想给我的被动服务器分配更多的内存,而这个服务器已经启动了,不需要重新启动它(我有让它们都有太多的xmx-注意,它们会在启动时消耗内存,我不能允许内存不足的可能性)。

    所以我想要被动-低XMX 一旦主动停止,我希望被动接收更多的xmx。

    我有办法做到这一点吗? 谢谢

    4 回复  |  直到 7 年前
        1
  •  5
  •   Edwin Buck    14 年前

    这很好,但据我所知,这不是Sun提供的JVM的一个选项。

    xmx选项是指定最大内存,它可以防止jvm占用整个机器的可用内存。如果您想将其设置得更高,就不需要JVM分配所有的内存。为什么不把它设置为一个非常高的数字,让JVM随着时间的推移而增长呢?

    为了确保您的JVM不会以太少的内存开始(在内存增长到所需大小时会产生大量停顿),请将XMS调整到您希望在启动时为JVM分配的大小。

        2
  •  3
  •   Greg Case    14 年前

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

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

    java (windows) java (*nix) 视情况而定(尽管 XMS XMX 在所有平台上具有相同的一般意义)。

        3
  •  2
  •   Eric J.    14 年前

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

    XMX交换机管理Java实例可能消耗的最大堆大小。xms控制启动量。

    如果您将备用实例上的xms small和xmx设置为程序所需的最大值,然后切换到备用实例(杀死常规实例),它应该可以正常工作。

        4
  •  0
  •   Arkadiy    7 年前

    为了让JVM填满所有堆,您必须生成足够的对象,以便在年轻一代集合中存活下来。这在轻负载的备用服务器上是不太可能的。

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

    更新:新的g1收集器使用不同的配置选项。请看 http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

    -xx:启动EAPCouseCypercent=45

    iow,当当前堆(最初最小堆大小)用完45%时,将启动与年轻一代集合等效的集合。轻负载服务器永远不应该保留最小堆大小(除非它生成相对较长的活动对象,在这种情况下,请参见-xx:maxtenuringstreshold)。