我有基于Netty的服务器应用程序。它解码消息(来自json)并将其发送回客户端(简单回声)。当我从一个客户端(超过15k /秒)发送大量消息时,垃圾收集器无法启动并且内存使用量增长。
如何配置jvm以减少gc暂停并减少内存使用量?
答案 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暂停。