线上full gc分析与排查指南

1.首先分析一下Full GC触发的几个条件:
1).调用System.gc时,系统建议执行Full GC,但是不必然执行
2). Perm空间不足;
3). CMS GC时出现晋升失败和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);
4). 统计得到的Young GC晋升到老年代的平均大小大于老年代的剩余空间;
5). 主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题。

2.目前主流的HotSpot VM的垃圾回收都采用“分代回收”的算法,主要分为:新生代、老年代和持久代.
1)新生代(Young Generation):新建的对象会优先在新生代里面分配,而且新生代里面的对象一般生命周期都是比较短的。新生代的垃圾回收被称为Minor GC,经过Minor GC后只有少量对象存活,所以一般选用Copy算法,代价也比较小。

新生代内又分三个区:Eden区,两个Survivor区(From Survivor和To Survivor ),大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到两个Survivor区(中的一个)。当这个Survivor区满时,此区的存活且不满足“晋升”条件的对象将被复制到另外一个Survivor区。对象每经历一次Minor GC,年龄加1,达到“晋升年龄阈值”后,被放到老年代,这个过程也称为“晋升”。显然,“晋升年龄阈值”的大小直接影响着对象在新生代中的停留时间,在Serial和ParNew GC两种回收器中,“晋升年龄阈值”通过参数MaxTenuringThreshold设定,默认值为15。

  1. 老年代(Old Generation):在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代,该区域中对象存活率高。老年代的垃圾回收(又称Major GC)通常使用“标记-清理”或“标记-整理”算法。整堆包括新生代和老年代的垃圾回收称为Full GC(HotSpot VM里,除了CMS之外,其它能收集老年代的GC都会同时收集整个GC堆,包括新生代)。

3)永久代(Perm Generation):主要存放元数据,例如Class、Method的元信息,与垃圾回收要回收的Java对象关系不大。相对于新生代和年老代来说,该区域的划分对垃圾回收影响比较小。

一般我们先上遇到Full GC的问题,首先不要急于去修改jvm参数去调优,因为JVM调优化不是必须的,一定要深入理解之后才去着手去做优化,其实绝大部分你排查下来以后发现是代码的问题.关于这部分,我总结了一些常用的问题.


JVM性能优化.jpg

3.当JVM发生Full GC的时候,会引发STOP THE WORLD现象,Full GC的代价是非常高的远比Minor GC花费的时间长,除了垃圾回收器这些守护线程以外,当前所有的用户线程会被挂起,所以这个时候的外部请求不会被处理,对于并发要求比较高的应用很害怕遇到这种情况,一般我们会调整负载均衡算法针对这种情况.

4.Full GC排查指南:
1)首先查看Full GC花费的时间,比如2秒或以上,这种一般都需要尽快进行调优了.
2)堆dump来分析验证内存溢出的原因.
堆dump是把内存情况按一定格式输出到文件,可用于检查Java 内存中的对象和数据情况。可使用JDK中内置的jmap命令创建堆dump文件。创建文件过程中,Java进程会中断,因此不要在正常运行时系统上做此操作。
3)例如用内存分析工具JVisualVM分析内存分配情况
4)一般我们的应用启动脚本里面会打印GC的日志,并且会提前设定阈值,在80%的可能就就会触发Gc了.
5)正常情况下,我们会优先看下云服务器的CPU、内存、磁盘等的状况,用下top命令.
6)借助arthas强大的工具分析
dashboard观察一下HTTP请求的qps, rt, 错误数, 线程池信息等等
thread -n 3查看当前最忙的前N个线程并打印堆栈
jvm查看当前jvm信息
用trace命令分析方法内部调用路径,并输出方法路径上的每个节点上耗时
7)通常CMS GC比Parallel GC要好,因为CMS GC的执行中并不会伴随内存压缩,因此GC速度会更快一些
8)如果调整好参数后,需要做性能测试,然后连续观察几天

5.关于jvm调优的一些小tips:
1)把Xms和Xmx设置为相同,这样可以减少GC后重新分配带来的性能开销
2)把MaxPermSize和MinPermSize设置成一样(JDK8开始,没有了Perm,代替为元空间。元空间是直接存在内存中,不在JVM里面)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353