2

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

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

4

2 回答 2

4

您的描述听起来像是内存泄漏。垃圾收集器最终会启动,还是会以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使每个幸存者空间是伊甸园的一半

这两个设置将使新对象的“伊甸园”空间占据堆的 1/4。这是相当大的,所以希望大多数对象将在伊甸园度过他们的一生。幸存者配给将另外 1/4 的堆空间分配给幸存者空间(每个 1/8),以容纳中等寿命的对象。

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

于 2011-04-07T14:02:01.487 回答
0

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

-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=nn

控制 GC 暂停。

于 2012-10-17T16:10:38.897 回答