您当前所在位置: > 爆料站 > 有深度

线上服务FGC问题排查,看这篇就够了!

时间:2020-05-16 18:31:21  来源:  作者:网络

原标题:线上服务 FGC 问题排查,看这篇就够了!

作者 | 骆俊武

来源 | IT人的职场进阶

线上服务的GC问题,是Java程序非常典型的一类问题,非常考验工程师排查问题的能力。同时,几乎是面试必考题,但是能真正答好此题的人并不多,要么原理没吃透,要么缺乏实战经验。

过去半年时间里,我们的广告系统出现了多次和GC相关的线上问题,有Full GC过于频繁的,有Young GC耗时过长的,这些问题带来的影响是:GC过程中的程序卡顿,进一步导致服务超时从而影响到广告收入。

这篇文章,我将以一个FGC频繁的线上案例作为引子,详细介绍下GC的排查过程,另外会结合GC的运行原理给出一份实践指南,希望对你有所帮助。内容分成以下3个部分:

  • 从一次FGC频繁的线上案例说起

  • GC的运行原理介绍

  • 排查FGC问题的实践指南

从一次FGC频繁的线上案例说起

去年10月份,我们的广告召回系统在程序上线后收到了FGC频繁的系统告警,通过下面的监控图可以看到:平均每35分钟就进行了一次FGC。而程序上线前,我们的FGC频次大概是2天一次。下面,详细介绍下该问题的排查过程。

1. 检查JVM配置

通过以下命令查看JVM的启动参数:

psaux | grep "applicationName=adsearch"

-Xms4g -Xmx4g -Xmn2g -Xss1024K

-XX:ParallelGCThreads=5

-XX:+UseConcMarkSweepGC

-XX:+UseParNewGC

-XX:+UseCMSCompactAtFullCollection

-XX:CMSInitiatingOccupancyFraction=80

可以看到堆内存为4G,新生代为2G,老年代也为2G,新生代采用ParNew收集器,老年代采用并发标记清除的CMS收集器,当老年代的内存占用率达到80%时会进行FGC。

进一步通过 jmap -heap 7276 | head -n20 可以得知新生代的Eden区为1.6G,S0和S1区均为0.2G。

2. 观察老年代的内存变化

通过观察老年代的使用情况,可以看到:每次FGC后,内存都能回到500M左右,因此我们排除了内存泄漏的情况。

3. 通过jmap命令查看堆内存中的对象

通过命令 jmap -histo 7276 | head -n20

上图中,按照对象所占内存大小排序,显示了存活对象的实例数、所占内存、类名。可以看到排名第一的是:int[],而且所占内存大小远远超过其他存活对象。至此,我们将怀疑目标锁定在了 int[] .

4. 进一步dump堆内存文件进行分析

锁定 int[] 后,我们打算dump堆内存文件,通过可视化工具进一步跟踪对象的来源。考虑堆转储过程中会暂停程序,因此我们先从服务管理平台摘掉了此节点,然后通过以下命令dump堆内存:

jmap - dump: format=b,file=heap 7276

通过JVisualVM工具导入dump出来的堆内存文件,同样可以看到各个对象所占空间,其中int[]占到了50%以上的内存,进一步往下便可以找到 int[] 所属的业务对象,发现它来自于架构团队提供的codis基础组件。

5. 通过代码分析可疑对象

通过代码分析,codis基础组件每分钟会生成约40M大小的int数组,用于统计TP99 和 TP90,数组的生命周期是一分钟。而根据第2步观察老年代的内存变化时,发现老年代的内存基本上也是每分钟增加40多M,因此推断:这40M的int数组应该是从新生代晋升到老年代。

我们进一步查看了YGC的频次监控,通过下图可以看到大概1分钟有8次左右的YGC,这样基本验证了我们的推断:因为CMS收集器默认的分代年龄是6次,即YGC 6次后还存活的对象就会晋升到老年代,而codis组件中的大数组生命周期是1分钟,刚好满足这个要求。

至此,整个排查过程基本结束了,那为什么程序上线前没出现此问题呢?通过上图可以看到:程序上线前YGC的频次在5次左右,此次上线后YGC频次变成了8次左右,从而引发了此问题。

6. 解决方案

为了快速解决问题,我们将CMS收集器的分代年龄改成了15次,改完后FGC频次恢复到了2天一次,后续如果YGC的频次超过每分钟15次还会再次触发此问题。当然,我们最根本的解决方案是:优化程序以降低YGC的频率,同时缩短codis组件中int数组的生命周期,这里就不做展开了。

GC的运行原理介绍

上面整个案例的分析过程中,其实涉及到很多GC的原理知识,如果不懂得这些原理就着手处理,其实整个排查过程是很抓瞎的。

这里,我选择几个最核心的知识点,展开介绍下GC的运行原理,最后再给出一份实践指南。

1. 堆内存结构

大家都知道: GC分为YGC和FGC,它们均发生在JVM的堆内存上。先来看下JDK8的堆内存结构:

可以看到,堆内存采用了分代结构,包括新生代和老年代。新生代又分为:Eden区,From Survivor区(简称S0),To Survivor区(简称S1区),三者的默认比例为8:1:1。另外,新生代和老年代的默认比例为1:2。

堆内存之所以采用分代结构,是考虑到绝大部分对象都是短生命周期的,这样不同生命周期的对象可放在不同的区域中,然后针对新生代和老年代采用不同的垃圾回收算法,从而使得GC效率最高。

2. YGC是什么时候触发的?

大多数情况下,对象直接在年轻代中的Eden区进行分配,如果Eden区域没有足够的空间,那么就会触发YGC(Minor GC),YGC处理的区域只有新生代。因为大部分对象在短时间内都是可收回掉的,因此YGC后只有极少数的对象能存活下来,而被移动到S0区(采用的是复制算法)。

当触发下一次YGC时,会将Eden区和S0区的存活对象移动到S1区,同时清空Eden区和S0区。当再次触发YGC时,这时候处理的区域就变成了Eden区和S1区(即S0和S1进行角色交换)。每经过一次YGC,存活对象的年龄就会加1。

3. FGC又是什么时候触发的?

下面4种情况,对象会进入到老年代中:

  • YGC时,To Survivor区不足以存放存活的对象,对象会直接进入到老年代。

  • 经过多次YGC后,如果存活对象的年龄达到了设定阈值,则会晋升到老年代中。

  • 动态年龄判定规则,To Survivor区中相同年龄的对象,如果其大小之和占到了 To Survivor区一半以上的空间,那么大于此年龄的对象会直接进入老年代,而不需要达到默认的分代年龄。

  • 大对象:由-XX:PretenureSizeThreshold启动参数控制,若对象大小大于此值,就会绕过新生代, 直接在老年代中分配。

当晋升到老年代的对象大于了老年代的剩余空间时,就会触发FGC(Major GC),FGC处理的区域同时包括新生代和老年代。除此之外,还有以下4种情况也会触发FGC:

  • 老年代的内存使用率达到了一定阈值(可通过参数调整),直接触发FGC。

  • 空间分配担保:在YGC之前,会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果小于,说明YGC是不安全的,则会查看参数 HandlePromotionFailure 是否被设置成了允许担保失败,如果不允许则直接触发Full GC;如果允许,那么会进一步检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于也会触发 Full GC。

  • Metaspace(元空间)在空间不足时会进行扩容,当扩容到了-XX:MetaspaceSize 参数的指定值时,也会触发FGC。

  • System.gc 或者Runtime.gc 被显式调用时,触发FGC。

4. 在什么情况下,GC会对程序产生影响?

不管YGC还是FGC,都会造成一定程度的程序卡顿(即Stop The World问题:GC线程开始工作,其他工作线程被挂起),即使采用ParNew、CMS或者G1这些更先进的垃圾回收算法,也只是在减少卡顿时间,而并不能完全消除卡顿。

那到底什么情况下,GC会对程序产生影响呢?根据严重程度从高到底,我认为包括以下4种情况:

  • FGC过于频繁:FGC通常是比较慢的,少则几百毫秒,多则几秒,正常情况FGC每隔几个小时甚至几天才执行一次,对系统的影响还能接受。但是,一旦出现FGC频繁(比如几十分钟就会执行一次),这种肯定是存在问题的,它会导致工作线程频繁被停止,让系统看起来一直有卡顿现象,也会使得程序的整体性能变差。

  • YGC耗时过长:一般来说,YGC的总耗时在几十或者上百毫秒是比较正常的,虽然会引起系统卡顿几毫秒或者几十毫秒,这种情况几乎对用户无感知,对程序的影响可以忽略不计。但是如果YGC耗时达到了1秒甚至几秒(都快赶上FGC的耗时了),那卡顿时间就会增大,加上YGC本身比较频繁,就会导致比较多的服务超时问题。

  • FGC耗时过长:FGC耗时增加,卡顿时间也会随之增加,尤其对于高并发服务,可能导致FGC期间比较多的超时问题,可用性降低,这种也需要关注。

  • YGC过于频繁:即使YGC不会引起服务超时,但是YGC过于频繁也会降低服务的整体性能,对于高并发服务也是需要关注的。

其中,「FGC过于频繁」和「YGC耗时过长」,这两种情况属于比较典型的GC问题,大概率会对程序的服务质量产生影响。剩余两种情况的严重程度低一些,但是对于高并发或者高可用的程序也需要关注。

排查FGC问题的实践指南

通过上面的案例分析以及理论介绍,再总结下FGC问题的排查思路,作为一份实践指南供大家参考。

1. 清楚从程序角度,有哪些原因导致FGC?

  • 大对象:系统一次性加载了过多数据到内存中(比如SQL查询未做分页),导致大对象进入了老年代。

  • 内存泄漏:频繁创建了大量对象,但是无法被回收(比如IO对象使用完后未调用close方法释放资源),先引发FGC,最后导致OOM.

  • 程序频繁生成一些长生命周期的对象,当这些对象的存活年龄超过分代年龄时便会进入老年代,最后引发FGC. (即本文中的案例)

  • 程序BUG导致动态生成了很多新类,使得 Metaspace 不断被占用,先引发FGC,最后导致OOM.

  • 代码中显式调用了gc方法,包括自己的代码甚至框架中的代码。

  • JVM参数设置问题:包括总内存大小、新生代和老年代的大小、Eden区和S区的大小、元空间大小、垃圾回收算法等等。

2. 清楚排查问题时能使用哪些工具

  • 公司的监控系统:大部分公司都会有,可全方位监控JVM的各项指标。

  • JDK的自带工具,包括jmap、jstat等常用命令:

    # 查看堆内存各区域的使用率以及GC情况

    jstat -gcutil -h20 pid 1000

    # 查看堆内存中的存活对象,并按空间排序

    jmap -histo pid | head -n20

    # dump堆内存文件

    jmap -dump:format=b,file=heap pid

  • 可视化的堆内存分析工具:JVisualVM、MAT等

3. 排查指南

  • 查看监控,以了解出现问题的时间点以及当前FGC的频率(可对比正常情况看频率是否正常)

  • 了解该时间点之前有没有程序上线、基础组件升级等情况。

  • 了解JVM的参数设置,包括:堆空间各个区域的大小设置,新生代和老年代分别采用了哪些垃圾收集器,然后分析JVM参数设置是否合理。

  • 再对步骤1中列出的可能原因做排除法,其中元空间被打满、内存泄漏、代码显式调用gc方法比较容易排查。

  • 针对大对象或者长生命周期对象导致的FGC,可通过 jmap -histo 命令并结合dump堆内存文件作进一步分析,需要先定位到可疑对象。

  • 通过可疑对象定位到具体代码再次分析,这时候要结合GC原理和JVM参数设置,弄清楚可疑对象是否满足了进入到老年代的条件才能下结论。

总结

这篇文章通过线上案例并结合GC原理详细介绍了FGC的排查过程,同时给出了一份实践指南。

后续会以类似的方式,再分享一个YGC耗时过长的案例,希望能帮助大家吃透GC问题排查,如果觉得本文对你有帮助,请帮忙转发或者点个再看!

作者简介 前亚马逊工程师,现58转转技术总监,持续分享个人的成长经历,希望为你的职场发展带来些新思路 游戏网

相关下载

玩家评论

大地影院:一款为电影爱好者量身打造的线上购票软件

  大地影院app是一款为电影爱好者量身打造的线上购票软件,提供给用户各种最新活动用最低的票价让你买到最想看的电影,享受不一样的影院体验!大地影院app每日实时更新,提供最优详情>>

阅读: 0
日期: 2020-05-16
任天堂分享《动森》主题曲短片多位艺术家线上合奏

任天堂分享《动森》主题曲短片 多位艺术家线上合奏 2020-05-16 11:55:41来源:游戏下载编辑:松鼠骑士评论(0) 详情>>

阅读: 2
日期: 2020-05-16
任天堂分享《动森》主题曲短片 多位艺术家线上合奏

近日任天堂官方油管分享了一段视频,其中数位艺术家在疫情居家隔离期间,线上合奏出了《集合啦!动物森友会》的主题曲,下面就一起欣赏吧。 视频欣赏:详情>>

阅读: 0
日期: 2020-05-16
《GTAOL》豪华版新手线上开局玩法教学

《GTAOL》游戏中领取豪华版的玩家会在游戏开始时领到一些奖励,这些奖励能够帮助新手玩家度过前期,下面请看玩家“图尔加详情>>

阅读: 5
日期: 2020-05-16
京东高管解读一季度财报:疫情推动线上超市需求猛增

   北京时间5月15日晚间消息,京东(Nasdaq:JD)今日发布了截至3月31日的2020年第一季度财报,净营收为1462亿元人民币(约合206亿美元),同比增长20.7%。归属于普通股股东的净利润详情>>

阅读: 0
日期: 2020-05-15
国家电网线上产业链金融平台“电e金服”正式上线

原标题:国家电网线上产业链金融平台“电e金服”正式上线 国家电网有限公司线上产业链金融平台——“电e金服”15日在京正式发布上线。国家电网公司详情>>

阅读: 0
日期: 2020-05-15
DH公开赛将更改为分地区线上进行,总奖池达30万美金

  5月初,DreamHack已经表示,由于近期新冠的病情,他们在瓦伦西亚,蒙特利尔和海得拉巴的公开赛已经更改为线上进行。现在有了新的赛事分别替换这三场公开赛,DH夏季欧洲公开赛,DH夏详情>>

阅读: 0
日期: 2020-05-15
《GTAOL》5月14日每周线上奖励内容一览

第1页: 详情>>

阅读: 0
日期: 2020-05-15
电竞线上流量暴涨斗鱼LPL赛事直播间关注人数突破1500万_英雄联盟

原标题:电竞线上流量暴涨 斗鱼LPL赛事直播间关注人数突破1500万 中新经纬客户端5月15日电 “超长假期”过后,腾讯交出了2020年Q1财报,玩家们长时间的详情>>

阅读: 0
日期: 2020-05-15
GTA5线上免费辅助 v2.8.6.4 最新版

修改器介绍 GTA5线上辅助是专门为GTA5线上模式所制作的多功能辅助工具,具有地图传送、免费刷钱、角色服装编辑、角色属性修改等等详情>>

阅读: 13
日期: 2020-05-15
多地上演复课“大戏”线上线下如何衔接是关键

多地上演复课“大戏” 线上线下如何衔接才是关键近日,伴随着中小学开学复课而来的,不仅有久违的琅琅读书声,还有网友对于从网课到课堂、从线上详情>>

阅读: 0
日期: 2020-05-15
《GTA5》线上防误封指南

详情>>

阅读: 0
日期: 2020-05-14
车车灯:一款为用户提供线上驾考学习的辅助软件

  车车灯app是一款为用户提供线上驾考学习的辅助软件,拥有海量好口碑驾校,车车灯app汇聚非常专业的驾考培训学校,帮助用户号更加轻松的进行驾考学习。提供在线问答服务,有什么详情>>

阅读: 4
日期: 2020-05-14
应急体系官微集体线上科普 微博公开课直播观看量超2000万

  5月12日是第12个全国防灾减灾日,今年的主题是“提升基层应急能力,筑牢防灾减灾救灾的人民防线”。5月9日至15日为防灾减灾宣传周,围绕这一主题,全国各省应急体系进行了广详情>>

阅读: 3
日期: 2020-05-14
GTA5线上模式游戏系统详解

GTA5线上模式游戏系统详解 发布时间:2020-05-14 14:32 来源:NGA 作者:Parrk 详情>>

阅读: 8
日期: 2020-05-14
B2B通过线上营销成单的姿势

原标题:B2B 通过线上营销成单的姿势 本文来自微信公众号“牛透社”(ID:Neuters),作者 何润。 文章整理自崔牛闭门会,由致趣百川创始人&CEO 何润先生的详情>>

阅读: 0
日期: 2020-05-14
线上随时下单门店随时送货(消费视窗·走近线上新型消费⑤)

原标题:线上随时下单 门店随时送货(消费视窗·走近线上新型消费⑤) 如今,越来越多的实体店开展门店到家服务。图为外卖小哥在上海某超市准备配送居民详情>>

阅读: 0
日期: 2020-05-14
GTA5线上模式常见问题汇总

GTA5线上模式常见问题汇总 发布时间:2020-05-14 13:00 来源:小黑盒社区 作者:释空 详情>>

阅读: 20
日期: 2020-05-14
GTA5线上模式起步攻略

GTA5线上模式起步攻略 发布时间:2020-05-14 13:55 来源:NGA 作者:Parrk 详情>>

阅读: 14
日期: 2020-05-14
三比零全胜夺冠,秘密问鼎Weplay普斯卡线上赛!

  北京时间3月13日的凌晨,持续了大半个月的Weplay普斯卡线上赛终于告一段落。决赛日的最终结果可谓是在不少玩家的预料之中——没有爆冷也没有奇迹,硬实力高人一等的秘密大详情>>

阅读: 0
日期: 2020-05-14
S10将成为里程碑,总决赛时间确认不改变,线上赛模式值得商榷

原标题:S10将成为里程碑,总决赛时间确认不改变,线上赛模式值得商榷 今年的S10我们LPL再次迎来了本土作战,其实这一届的比赛对于我们LPL来说可以说是非常详情>>

阅读: 1
日期: 2020-05-14
SE将取消"代替E3"的线上发布会将以单个游戏发布为主

【导读】今年E3由于疫情原因而宣布取消,这使得很多游戏厂商的计划被大乱从而准备自己举办线上发布会。而根据最新的消息SE将取消“替代E3”的线上发布会。--> 详情>>

阅读: 2
日期: 2020-05-14
五五购物节线上销售额突破400亿,苏宁、叮咚买菜等平台持续加码

原标题:五五购物节线上销售额突破400亿,苏宁、叮咚买菜等平台持续加码 在传统消费升级的同时,新兴消费正在崛并成为市场消费热点。 5月13日,上海市政详情>>

阅读: 0
日期: 2020-05-13
兰研打造“直播全链条”助力本土企业线上“复苏”

原标题:兰研打造“直播全链条” 助力本土企业线上“复苏” 5月10日,抖音拥有500W+粉丝的兰研品牌创始人许晓兰,携泉州本土品牌友臣、大嘴猴等,启幕首详情>>

阅读: 2
日期: 2020-05-13
大前辈出动!东方神起、SuperJunior助力线上演唱会!_男孩子

原标题:大前辈出动!东方神起、Super Junior助力线上演唱会! 提起东方神起和Super Junior,别说在韩国了,在全球的知名度和影响力都是不容忽视的,他们是当详情>>

阅读: 2
日期: 2020-05-13
游戏午报:育碧线上展会定档7.13;《文明6》再更季票添新文明_玩家

原标题:游戏午报:育碧线上展会定档7.13;《文明6》再更季票添新文明 今天的新闻有:育碧线上游戏展会定档7月13日,3A大作蓄势待发;发售四年,《文明6》再更详情>>

阅读: 5
日期: 2020-05-12
「勇者斗恶龙:达尔大冒险」新动漫确定举办线上发布会

昨日,据 Fami通 报道,「勇者斗恶龙」官方将于5月27日“DQ日”期间举办线上直播发布会,公开改编自1991年经典动画「勇者斗恶龙:达尔大冒险」(又名:神龙之谜)重制版动详情>>

阅读: 0
日期: 2020-05-12
线上多人FPS《量子联盟》5月26日Steam抢先体验

近日,《量子联盟(Quantum League)》官方发布了消息,表明了《量子联盟》抢先体验版将在5月26在Steam上登陆,游戏支持官方简体中文。据说官方也在开发主机版详情>>

阅读: 4
日期: 2020-05-12
梁靖康担任G-SHOCK品牌形象大使助力线上云发布会嗨爆全场_潮流

原标题:梁靖康担任G-SHOCK品牌形象大使 助力线上云发布会嗨爆全场 昨日,G-SHOCK正式宣布演员梁靖康成为品牌形象大使。梁靖康自出道以来,一直备受时详情>>

阅读: 1
日期: 2020-05-12
中行APP推原油宝线上和解协议,部分投资者已收到补偿款

原标题:中行APP推原油宝线上和解协议,部分投资者已收到补偿款 图片来源:视觉中国 记者|张晓云 5月11日,多位中国银行原油宝投资者向界面新闻记者反映详情>>

阅读: 2
日期: 2020-05-12
育碧7月13日办线上发布会独家游戏新闻,新作品披露

育碧7月13日办线上发布会 独家游戏新闻,新作品披露 2020-05-12 08:30:54来源:游戏下载编辑:血河评论(0) 详情>>

阅读: 5
日期: 2020-05-12
海量新内容蓄势待发育碧线上发布会时间公布_Ubisoft

原标题:海量新内容蓄势待发 育碧线上发布会时间公布 育碧刚刚公布消息,将会举行一场“E3风格展示会”Ubisoft Forward来展示自家游戏新闻、情报和未详情>>

阅读: 2
日期: 2020-05-12
多所高校期末考试可线上进行怎么回事?哪些高校期末考试在线上进行

受疫情影响,全国各地高校采取线上授课,近日,部分高校相继宣布:期末考试线上进行!清华大学5月7日,清华大学教务处和研究生院联合发布《关于2019~2020学年度春季详情>>

阅读: 1
日期: 2020-05-11
云端·话家事③|线上线下融合助推家居企业转型升级迎发展

原标题:云端·话家事③|线上线下融合 助推家居企业转型升级迎发展 编者按:面对疫情,各行业纷纷开启云端营销模式。据相关调研报告指出,2020年一季度家详情>>

阅读: 2
日期: 2020-05-11
圣地亚哥国际动漫展2020将以线上形式举办

据外媒SlashGear报道,4月中旬,官方宣布今年的圣地亚哥国际动漫展因新冠病毒疫情而被取消。与今年计划举办的许多其他大型活动一样,由于封锁限制、前景不明朗,以及大量人群聚集详情>>

阅读: 2
日期: 2020-05-11
多所高校明确期末考核可线上进行目前哪些大学可以线上考试

由于受新冠肺炎疫情影响,全国各地高校采取线上授课。近日,部分高校明确,期末考试采取线上考核方式进行。5月7日,湖北大学教务处发布通知表示,2019-2020学年详情>>

阅读: 9
日期: 2020-05-11
直播15分钟,接客到半夜  线上展会为何将成未来20年的新“起点”?

原标题:直播15分钟,接客到半夜  线上展会为何将成未来20年的新“起点”? 【环球网科技报道 记者 勃潺】疫情之下,因场地、交通、防控等原因而取消的详情>>

阅读: 5
日期: 2020-05-11
美团大学美酒学院:助力高星酒店实现餐饮“深度线上化”

原标题:美团大学美酒学院:助力高星酒店实现餐饮“深度线上化” 日前,美团大学美酒学院围绕“运用美团点评餐饮产品提升酒店线上餐饮收益”议题,为山详情>>

阅读: 2
日期: 2020-05-11
趣头条:线上内容的价值体现在对幸福感获得感的正确引导感知

原标题:趣头条:线上内容的价值体现在对幸福感获得感的正确引导感知 趣头条。人民视觉 资料图 作为一家移动内容平台,趣头条的品牌初心正如其名,是持详情>>

阅读: 3
日期: 2020-05-11
董明珠再次直播带货千万补贴发力线上销售

原标题:董明珠再次直播带货 千万补贴发力线上销售 4月24日,格力电器董事长董明珠的抖音直播带货首秀,因为网络问题“翻车”。5月10日晚,曾经的“销售详情>>

阅读: 6
日期: 2020-05-11
精彩推荐