请教 JAVA 现在是如何应对 GC stop-the-world 导致的服务暂停? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ncisoft
V2EX    Java

请教 JAVA 现在是如何应对 GC stop-the-world 导致的服务暂停?

  •  1
     
  •   ncisoft 2016-06-01 03:13:01 +08:00 via Android 8486 次点击
    这是一个创建于 3420 天前的主题,其中的信息可能已经有所发展或是发生改变。
    无论是 web server ,还是 service server ,碰到 full GC 的 stop-the-world 都很麻烦,轻则 503 ,重则服务恢复之后的雪崩。光靠负载均衡器挡前面貌似不能很好地解决问题

    我以前的经验是优化 GC 参数,但 CMS 也还是不行,还是会碰到耗时几分钟的 stop-the-world 。从这点来说, JAVA 还不如一个进程伺候一个请求的脚本语言来得净和行为可预测,如 PHP Ruby 。

    有几年没跟踪技术了,也不知道在内存越来越便宜、堆越来越大的今天, JAVA 有什么好的解决方案了吗?比如 G1 实际效果如何?
    33 条回复    2017-03-07 16:24:40 +08:00
    hrong
        1
    hrong  
       2016-06-01 07:56:42 +08:00 via Android
    性能优化了吗?开个 profile 监测一下呗
    或者用第三方服务,名字我就不说了,省得有广告嫌疑
    ncisoft
        2
    ncisoft  
    OP
       2016-06-01 08:00:01 +08:00 via Android
    @hrong 性能优化不优化,都和 stop-the-world 没有本质关系
    hrong
        3
    hrong  
       2016-06-01 08:12:46 +08:00 via Android
    @ncisoft 内存的利用不算性能范畴?

    你既然都懂,那我就不 BB 了。
    ncisoft
        4
    ncisoft  
    OP
       2016-06-01 08:22:15 +08:00 via Android
    @hrong 代码写得再好、内存利用得再好, JAVA 系统能逃得过 full GC 和 stop-the-world ?
    fcicq
        5
    fcicq  
       2016-06-01 08:25:43 +08:00
    没钱就慢慢折腾吧. 有钱上 Azul
    wwqgtxx
        6
    wwqgtxx  
       2016-06-01 08:37:54 +08:00 via Android
    貌似找不到什么现成的答案,自己用 java8 执行一遍试试吧
    NullMan
        7
    NullMan  
       2016-06-01 08:44:08 +08:00
    性能优化是能写 800 页的知识, 一句话是很难说清楚. 我觉得呢, 还是看书获取相关知识比较好.
    wangxn
        8
    wangxn  
       2016-06-01 08:50:50 +08:00 via Android
    Azul Zing
    ncisoft
        9
    ncisoft  
    OP
       2016-06-01 08:51:02 +08:00 via Android
    @wwqgtxx 实验室代替不了生产环境的实操,我离开一线有几年了,谢谢你的建议。
    ncisoft
        10
    ncisoft  
    OP
       2016-06-01 08:54:38 +08:00 via Android
    @wangxn Azul 确实挺神的,我在 08 年还听说过一个更神的方案,美国人做的, 384 cores 512G RAM , GC 0 延时,用的硬件方案配合
    weiweiwitch
        11
    weiweiwitch  
       2016-06-01 09:07:47 +08:00
    感觉楼上的答案都没有说到点子上。现在 Java 不管是 CMS 还是 G1 ,停顿延迟都已经很低了。如果遇到 stop-the-world 的停顿,甚至达到了几分钟。那么绝对是因为内存泄漏导致可用内存不足,从而触发 full Gc 。
    这种情况一个是看看 Xmx 是否设小了,另外就是好好查查代码中是否有内存泄漏。
    开发环境下做个压力测试。然后 Java 内带的 jvisualvm 可以看基本的内存增长。如果内存慢慢涨到 Xmx 的极限值,那么就是有内存泄漏。如果真有内存泄漏,仔细检查代码,另外到网上下载个 jprofiler ,然后耐心的开始找哪里泄漏了。
    coolcfan
        12
    coolcfan  
       2016-06-01 09:10:50 +08:00
    性能优化里面很重要的一点就包括让代码在运行的时候“产生更少的垃圾”和“产生垃圾的速度可预测”吧。
    ncisoft
        13
    ncisoft  
    OP
       2016-06-01 09:13:27 +08:00 via Android
    @weiweiwitch 请教你在实际生产环境中用到多大的堆, full GC 一半是多长时间?
    weiweiwitch
        14
    weiweiwitch  
       2016-06-01 09:17:11 +08:00
    我们负载最终的服务的 Xmx 是 30G 内存, 24 核的 CPU 。由于是 tcp 长连接的,并且要求是毫秒级的响应,是不允许出现 full Gc 的。
    ncisoft
        15
    ncisoft  
    OP
       2016-06-01 09:19:13 +08:00 via Android
    @weiweiwitch 这么历害,数值亮瞎眼了哦,用的哪个 jdk 和什么垃圾回收器呢
    weiweiwitch
        16
    weiweiwitch  
       2016-06-01 09:26:25 +08:00
    @ncisoft 大部分情况下 Oracle 的 JDK 已经可以满足需求了。 6G 内存以下用 CMS 回收, 6G 内存以上并且 CPU 强劲用 G1 回收。
    最重要的是不要出现内存泄漏,另外是在确保代码可读性的基础上减少不必要的对象的创建。
    ncisoft
        17
    ncisoft  
    OP
       2016-06-01 09:30:05 +08:00 via Android
    @weiweiwitch 你的意思是 azul 快要关门了?
    weiweiwitch
        18
    weiweiwitch  
       2016-06-01 09:40:49 +08:00
    @ncisoft 我的意思是绝大部分需求是不需要那么高的实时性,更多时候是需要更大的吞吐量。所以 Oracle 的 JDK 对于大部分人来说已经够用了。
    mathgl
        19
    mathgl  
       2016-06-01 09:50:57 +08:00
    @ncisoft azul zing 据他们员工介绍可以在 2TB ram 维持 10ms 以下的停顿。 不过我想一般的应用也没太大机会用到 2TB Ram
    xAx
        20
    xAx  
       2016-06-01 09:58:07 +08:00
    三大商用 jvm 都无法避免 stop-the-world
    如果想尽可能降价 full gc 的影响,那么不要一个 server 分几十 g 内存,
    而是采用 32 位 jvm ,每个 server 分 2 至 4g 内存,建立 server 集群的方式。
    这是 jvm 性能优化的一种常用方案。主要解决 full gc 时扫描的内存区块大小和避免 64 位 jvm 内存对齐的性能损耗。

    看个七八百页书后对 jvm 优化应该就能入门
    beneo
        21
    beneo  
       2016-06-01 10:00:40 +08:00
    gc log 查一下, dump heap 看一下
    ncisoft
        22
    ncisoft  
    OP
       2016-06-01 10:06:46 +08:00 via Android
    @xAx 以前我是直接看 sun 官网上的 hotspot 文档,关于各种垃圾回收器的实现机制和相关参数,书还真没看过
    ncisoft
        23
    ncisoft  
    OP
       2016-06-01 10:10:41 +08:00 via Android
    看来大家的主要意见还是集中在代码编写和 JVM 优化上, LinkedIn 在 JVM 优化上做了不少的工作,分享出来的相关资料也不少,可供参考
    ncisoft
        24
    ncisoft  
    OP
       2016-06-01 10:15:58 +08:00 via Android
    讲到 GC ,我见过最好的内存模型还是 Erlang 的,一个 coroutine 有私有堆和私有堆栈, coroutine 之间不共享数据,受语言模型限制, JAVA 肯定没法比, golang 也是
    xudd
        25
    xudd  
       2016-06-01 10:29:35 +08:00
    @ncisoft LinkedIn 是什么?
    swolf119
        26
    swolf119  
       2016-06-01 10:32:32 +08:00
    堆并不是越大越好,反而越大看 gc 一次时间越久
    小堆的 web 应用主要还是 CMS ,大堆可以艹 G1
    zhenjiachen
        27
    zhenjiachen  
       2016-06-01 10:33:32 +08:00
    @xudd linkedin 是一个公司。
    xudd
        28
    xudd  
       2016-06-01 10:44:47 +08:00
    @zhenjiachen 哦,我查了一下是一个职场社交平台(领英)吗?我还以为是一个人呢,嘿嘿
    ncisoft
        29
    ncisoft  
    OP
       2016-06-01 16:56:03 +08:00 via Android
    @xudd 在真外企混过的基本都知道 LinkedIn 的
    wander2008
        30
    wander2008  
       2016-06-02 07:24:59 +08:00 via iPhone
    full gc 还能到几分钟,你们到底啥业务啊?
    iminto
        31
    iminto  
       2016-06-27 14:40:52 +08:00
    ull gc 还能到几分钟,你们的程序员可以开除了
    ncisoft
        32
    ncisoft  
    OP
       2016-06-27 15:40:48 +08:00 via Android
    @iminto 那你们线网的 full gc 是多短? 5ms 有么
    iminto
        33
    iminto  
       2017-03-07 16:24:40 +08:00
    @ncisoft 从没遇到超过 2 秒的情况
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     879 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 21:34 PVG 05:34 LAX 14:34 JFK 17:34
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86