有在大型 Netty 长连接服务器中使用 G1 的吗?

2018-01-28 18:48:56 +08:00
 xhinliang

楼主现在生产环境是若干台 Netty 长连接服务器,每个 JVM 节点的最大堆设置为 8G,使用了 CMS。 目前单 JVM 节点峰值连接数大概是 10w 左右,在高峰的时候很容易出现 2s 以上的 Full GC。

目前考虑换成 G1。

前两天试用了下,发现效果差强人意,虽然少了 Full GC,但是机器 CPU 使用率也变高了,平均 GC 时间几乎是原来的两倍( 70ms => 138ms )

有踩过坑的小伙伴分享下经验吗?

4213 次点击
所在节点    Java
15 条回复
jeremaihloo
2018-01-28 18:58:49 +08:00
差强人意:大体上使人满意
movistar
2018-01-28 19:58:58 +08:00
少了 2 秒的 Full GC 但是 YGC 增加了
这叫差强人意....没问题.........
Rickkkkkkk
2018-01-28 23:08:35 +08:00
躲开高峰期定时的调用 system.gc()
metrxqin
2018-01-28 23:35:41 +08:00
jstat -gccapacity 贴下?
wdlth
2018-01-28 23:51:44 +08:00
不清楚你是用什么参数的,如果你还保留原有的一些 GC 参数,会造成参数间的互相影响。
xhinliang
2018-01-29 08:49:32 +08:00
@jeremaihloo 我就是表达这个意思....
skyFuture
2018-01-29 09:28:17 +08:00
按照 netty 的设计,堆外内存是可以重用,发生 fgc 的概率应该很小。会不会发生了内存泄漏呢?
lujiajing1126
2018-01-29 10:18:17 +08:00
做个 heap snapshot 分析下哪些对象比较大会且容易被 gc 然后针对性优化一下吧?
pczb
2018-01-29 10:30:44 +08:00
g1 的 gc 138ms 时间是 stop-the-world 的时间还是其他
xhinliang
2018-01-29 10:53:53 +08:00
@skyFuture 没有发生 Full GC
xhinliang
2018-01-29 10:57:30 +08:00
@pczb Stop The World
xhinliang
2018-01-29 11:07:08 +08:00
@lujiajing1126 谢谢,我下午试试
xhinliang
2018-01-29 11:08:52 +08:00
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
0.0 12582912.0 5713920.0 0.0 212992.0 5500928.0 0.0 12582912.0 6868992.0 6868992.0 0.0 1150976.0 115188.0 0.0 1048576.0 14072.0 17969 0
xhinliang
2018-01-29 11:09:05 +08:00
seancheer
2018-01-29 11:46:50 +08:00
关于一些参数
-XX:MaxTenuringThreshold=n Sets the maximum tenuring threshold for use in adaptive GC sizing. The current largest value is 15. The default value is 15 for the parallel collector and is 4 for CMS.(需要注意的是,这个参数默认为 15,但是对于 CMS 来讲,默认为 4,该段文字摘自官方文档)
-XX:+UseCMSCompactAtFullCollection:CMS 使用标记-清除法进行垃圾回收,因此不对内存随便进行整理,使用该选项可以指定对内存碎片进行整理,该选项默认是开启的
-XX:+ScavengeBeforeFullGC:指定进行 fullGC 前进行一次 young GC
-XX:CMSInitiatingOccupancyFraction:CMS 被触发时老年代使用的比例
-XX:MaxGCPauseMillis=50:一次 GC 的最大时间,单位为 ms,使用 parallel scanvenge 算法和 G1 的时候才会有效
-XX:PretenureSizeThreshold:超过设定的大小,那么对象将会直接被分配到老年代。单位为 byte,默认为 0,不开启该功能。(对于 PS 的收集算法,该选项无效)
-XX:+HandlerPromotionFailure:在 Minore GC 前,jvm 会预估老年代最大可用的连续空间是否大于新生代所有对象总空间,如果小于,那么如果打开此开关,jvm 会计算老年代最大可用的连续空间是否大于 [历代] 年轻代晋升到老年代所有对象的平均大小,如果小于,那么会进行 Minore GC,否则,进行 full GC ; 如果此开关没有打开,那么会直接进行 full GC,(目前根据 jdk 源码,该选项已经无效,jvm 会直接进行上述的判断)
GC 常见的几个误解:
除了 CMS 和 G1 外,PSYoung Gen,DefNew,PSOldGen,ParOldGen 等收集算法都需要 stw。
STW(stop-the-world)并不等于 full gc,full gc 指发生在年轻代和老年代的 gc。
CMS 是发生在老年代的 GC 算法,但是其中的两个阶段,initial marking 和 final remark 发生在年轻代和老年代,因此其 stw 属于 full gc 的统计数据里。
当 CMS 运行过程中,老年代空间不够,默认会使用 Serial gc 进行一次 full gc。


楼主可以参考着看是不是需要调整。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/426600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX