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 · 8077 次点击
    这是一个创建于 3122 天前的主题,其中的信息可能已经有所发展或是发生改变。
    无论是 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   ·   实用小工具   ·   4740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:59 · PVG 17:59 · LAX 01:59 · JFK 04:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.