jvm conf为高负载时的正常gc

时间:2011-04-07 13:57:41

标签: java garbage-collection jvm netty

我有基于Netty的服务器应用程序。它解码消息(来自json)并将其发送回客户端(简单回声)。当我从一个客户端(超过15k /秒)发送大量消息时,垃圾收集器无法启动并且内存使用量增长。

如何配置jvm以减少gc暂停并减少内存使用量?

2 个答案:

答案 0 :(得分:3)

您的说明听起来像是内存泄漏。垃圾收集器最终会启动,还是最终得到OutOfMemoryError

如果你不这样做,那么听起来你正在遇到这样一种情况:对象的生存时间足以进入终生代(我在这里假设是Sun JVM)。而解决方案是增加年轻一代相对于终身一代的规模。

这是一个解释Sun JVM分代收集器的链接(它适用于1.5 JVM,但我相信1.6的选项没有改变):http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

您想要尝试的选项是NewRatio,这是年轻和终身世代之间的比率,SurvivorRatio,这是伊甸园和两个幸存者空间之间的比率。我可能会尝试以下方法:

  • -XX:NewRatio=1为年轻一代提供对象堆的一半
  • -XX:SurvivorRatio=2使每个幸存者空间都是伊甸园的一半

这两个设置将使新对象的“Eden”空间占用堆的1/4。这是非常大的,所以希望大多数物品将在伊甸园度过一生。幸存者口粮给幸存者空间(每个1/8)提供了另外1/4的堆,以容纳具有中等寿命的物体。

当然,不要盲目设置选项。相反,使用jconsole(JDK发行版的一部分)来查看堆真正发生的事情。您可能会发现(1:6)的默认幸存者比率比我建议的要好。

答案 1 :(得分:0)

要配置jvm以减少gc暂停并减少内存使用量,您需要选择合适的GC收集器。 CMS是一个低暂停收集器。您可以设置-XX:+ UseConcMarkSweepGC来启用它。而且,您可以微调其他参数,例如

-XX:+ UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction = nn

控制GC暂停。