java在运行时动态增加xmx

时间:2010-05-21 17:40:59

标签: java performance

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

所以我想要被动 - 低xmx 一旦活跃下来,我希望我的被动接收更多xmx。

有没有办法让我实现这一目标。 感谢

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

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

视情况而定java (windows)java (*nix)(尽管-Xms-Xmx在所有平台上具有相同的一般含义。)

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:0)

为了让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)。