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

诊断由 System.gc() 导致的 CPU 飙升和 GC overhead alert

  •  
  •   manecocomph · 32 天前 · 650 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在六月一个炎炎烈日的周六, 我坐在凉爽的空调房里, 突然发现生产环境有个机器 CPU 一直狂转, 我想着: 这可不行, 本来地球就够热的了, 为了保护环境, 一定要把它的 CPU 降下来.

    它是一个 java 应用程序, 进一步查看其它指标, 发现这货还一直报 GC overhead alert, 原来有个二货工程师写的新 bug, 一定要把它找出来.

    下载 verbose GC log, 通过 log viewer 一看, 哇, 神奇: 无论老年代, 还是年轻代, 都有非常多的空闲内存. 如下图, 只有放大到 500 倍才能看清楚, 否则都是 Full GC 的黑线....

    那么下一步怀疑老年代被占满了, 可是, 还是很失望: 老年代空闲内存多的是

    1. 2019-06-15T00:40:55.978-0700: 53291.378: [Full GC2019-06-15T00:40:55.978-0700: 53291.378: [CMS: 168666K->168666K(1433600K), 0.3949710 secs] 172644K->168666K(2170880K), [CMS Perm : 123793K->123793K(524288K)], 0.3951790 secs] [Times: user=0.39 sys=0.00, real=0.39 secs]
    2. 2019-06-15T00:40:56.479-0700: 53291.879: [Full GC2019-06-15T00:40:56.479-0700: 53291.880: [CMS: 168666K->168665K(1433600K), 0.3926360 secs] 171687K->168665K(2170880K), [CMS Perm : 123793K->123793K(524288K)], 0.3928600 secs] [Times: user=0.38 sys=0.01, real=0.39 secs]

    下一步怀疑 System.gc() 或者 Runtime.gc(), 果然被我聪明的猜中了:

    那么如何修复这个问题呢?

    1. 找出这个 System.gc()代码, 直接去掉它;
    2. 在 JVM 启动参数中加上 -XX:+DisableExplicitGC

    原文链接: http://www.tianxiaohui.com/index.php/Java%E7%9B%B8%E5%85%B3/%E8%AF%8A%E6%96%AD%E7%94%B1-System-gc-%E5%AF%BC%E8%87%B4%E7%9A%84-CPU-%E9%A3%99%E5%8D%87%E5%92%8C-GC-overhead-alert.html

    3 回复  |  直到 2019-06-18 09:45:24 +08:00
        1
    airfling   31 天前
    写 java 最好不要有主动 gc 的吧,一般需要主动 gc 的也是定时去 gc,而不是每次执行完毕就 gc
        2
    senninha   31 天前
    楼主人才。。
    ps,"二货工程师"这么吊的吗,显式调用 gc- -
        3
    hebin   31 天前
    有点牛逼。。。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   989 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    ♥ Do have faith in what you're doing.