V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xhinliang
V2EX  ›  Java

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

  •  
  •   xhinliang · 2018-01-28 18:48:56 +08:00 · 4353 次点击
    这是一个创建于 2500 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    目前考虑换成 G1。

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

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

    15 条回复    2018-01-29 11:46:50 +08:00
    jeremaihloo
        1
    jeremaihloo  
       2018-01-28 18:58:49 +08:00   ❤️ 3
    差强人意:大体上使人满意
    movistar
        2
    movistar  
       2018-01-28 19:58:58 +08:00
    少了 2 秒的 Full GC 但是 YGC 增加了
    这叫差强人意....没问题.........
    Rickkkkkkk
        3
    Rickkkkkkk  
       2018-01-28 23:08:35 +08:00
    躲开高峰期定时的调用 system.gc()
    metrxqin
        4
    metrxqin  
       2018-01-28 23:35:41 +08:00 via Android
    jstat -gccapacity 贴下?
    wdlth
        5
    wdlth  
       2018-01-28 23:51:44 +08:00
    不清楚你是用什么参数的,如果你还保留原有的一些 GC 参数,会造成参数间的互相影响。
    xhinliang
        6
    xhinliang  
    OP
       2018-01-29 08:49:32 +08:00
    @jeremaihloo 我就是表达这个意思....
    skyFuture
        7
    skyFuture  
       2018-01-29 09:28:17 +08:00
    按照 netty 的设计,堆外内存是可以重用,发生 fgc 的概率应该很小。会不会发生了内存泄漏呢?
    lujiajing1126
        8
    lujiajing1126  
       2018-01-29 10:18:17 +08:00 via iPhone
    做个 heap snapshot 分析下哪些对象比较大会且容易被 gc 然后针对性优化一下吧?
    pczb
        9
    pczb  
       2018-01-29 10:30:44 +08:00
    g1 的 gc 138ms 时间是 stop-the-world 的时间还是其他
    xhinliang
        10
    xhinliang  
    OP
       2018-01-29 10:53:53 +08:00
    @skyFuture 没有发生 Full GC
    xhinliang
        11
    xhinliang  
    OP
       2018-01-29 10:57:30 +08:00
    @pczb Stop The World
    xhinliang
        12
    xhinliang  
    OP
       2018-01-29 11:07:08 +08:00
    @lujiajing1126 谢谢,我下午试试
    xhinliang
        13
    xhinliang  
    OP
       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
        14
    xhinliang  
    OP
       2018-01-29 11:09:05 +08:00
    seancheer
        15
    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。


    楼主可以参考着看是不是需要调整。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1043 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:55 · PVG 03:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.