java在运行时动态增加xmx

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

所以我想要被动 – 低xmx一旦主动下降,我希望我的被动接收更多的xmx。

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

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

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

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

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

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

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

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

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

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

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

要让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)。