我有基於Netty的服務器應用程序。它解碼消息(來自json)並將其發送回客戶端(簡單回聲)。當我從一個客戶端(超過15k /秒)發送大量消息時,垃圾收集器不會啓動並且內存使用量增長。jvm conf正常gc在高負載下
如何配置jvm以減少gc暫停並減少內存使用量?
我有基於Netty的服務器應用程序。它解碼消息(來自json)並將其發送回客戶端(簡單回聲)。當我從一個客戶端(超過15k /秒)發送大量消息時,垃圾收集器不會啓動並且內存使用量增長。jvm conf正常gc在高負載下
如何配置jvm以減少gc暫停並減少內存使用量?
你的描述聽起來像是內存泄漏。垃圾收集器最終會啓動,還是最終會出現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/8),以保持中等生活的物體。
當然,不要盲目設置選項。相反,使用jconsole
(JDK發行版的一部分)來查看堆中真正發生了什麼。您可能會發現默認的倖存者比例(1:6)比我所建議的要好。
要配置jvm以減少gc暫停並減少內存使用量,您需要選擇一個合適的GC收集器。 CMS是一個低暫停收集器。你可以設置-XX:+ UseConcMarkSweepGC來啓用它。而且,您可以微調其它參數如
-XX:+ UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction = NN
控制GC暫停。