FullGC排查心得

 

最近线上系统(JDK1.7)出现了屡次FullGC,可是状况都不同,今天有时间,将FullGC的排查思路以及如何解决记录下,供你们一块儿探讨。java

场景一:

系统发布上线以后,里面收到以下告警信息:apache

内容:计算周期:2019-11-15 00:16:00-18:00,节点:*.*.*.*,FullGC次数:63次(大于阈值:10次),已触发严重告警!

收到上述告警信息以后,第一反应就是代码新发布的功能有问题;可是因为当天发布功能有点多,一时半会没法定位到是哪一个功能引发的,所以从功能点排查引发FullGC有点难度;服务器

换个角度,既然发生了FullGC,无外乎几种状况:jvm

  1. 代码中显示调用System.gc();
  2. jvm的堆空间不足
  3. jvm的永久代空间不足

依据上述内容,先按照关键字gc()排查代码,发现代码中存在一个批量导出的功能,在for循环中每次都有显示调用,经过功能验证,发现每次代码执行到这里时都会收到告警信息;同时再次排查每次FullGC时jvm堆变换状况:
spa

 

 

 经过JVM内存使用状况能够确认,本次FullGC,PermGen、OldGen回收效率均为0%,说明虽然触发了FullGC可是因为并未到达上述2/3两种缘由,所以能够再次确认是因为代码中显示调用System.gc引发的,在把代码注释掉以后再次验证,未出现FllGC状况;线程

 

场景二:

场景一问题解决以后,过了2天,系统忽然间又发生相似的状况,再次排查代码,发现系统中全部gc()关键字均没有了,此时没法确认问题缘由。日志

为了明确该问题的缘由,从服务器上导出gc的详细日志excel

2019-11-26T17:04:52.849+0800: 669022.072: [Full GC (System.gc()) 580M->409M(4096M), 1.2260290 s

经过日志分析,发生FullGC的时候,依然是因为System.gc()致使的,可是代码中却没有,所以还须要分析全部请求,经过告警信息发现,全部告警均出如今2分钟以内,所以能够判定应该是跟某个功能相关,所以按照时间节点过滤这2分钟内容全部请求,经过对比发现,全部发生异常状况下均有一个业务请求在执行,经过代码分析发现这个请求是一个excel导入请求,为了明确这次fullGC的根本缘由,须要导出javacore(线程快照)code

经过分析快照日志发现:xml

 

 

 线程中存在System.gc()方法,经过代码查看,在excel导入过程当中使用了jxl组件,该组件中存在两个方法

 

 

 

 

 

 上述两处均存在现实调用System.gc(),虽然有gcDisabled属性控制,可是经过代码排查发现未设置该属性,某人为false,所以只要使用到上述两个方法,均会触发FllGC。

所以建议不要在使用jxl组件,改成poi组件,或者在使用jxl组件时显示设置gcDisabled属性便可。

场景三:

该场景跟上述都不同,在系统运行一段时间以后,忽然短期内发生接口出现严重超时的状况,此时经过监控系统查看jvm堆状况,

 

 

 发现OldGen已经快满了,于是触发FullGC,可是定位是因为什么触发GC,仍是花费了一番功夫。

仍是从日志下手,在出现FullGC的时候,发如今jvm中存在大量

org.apache.xmlbeans.impl.store.Xobj$AttrXobj
org.apache.xmlbeans.impl.store.Xobj$ElementXobj

说明,系统中大几率存在操做poi,所以迅速排查poi关键字,逐个方法排查(问题发生已经超过2小时还未定位到到问题,此时内心已是万分着急,可是再着急也须要平和心态,从已经日志和现象中逐一查找,不能随意猜想,此时的任何猜想均会引导你进入另外一个歧途),发如今一个批量导入的场景中,存在以下代码:

 

 上述代码的本意是将excel中的全部空行过滤掉,对于一个正常的excel是没有任何问题,可是若是是这样的一个excel文件,就可能会出现问题:

 

 经过图中能够发现,该excel竟然被创造出了100w行的空行,虽然经过上面的空过滤能够将这100w行过滤掉,可是不可忽视的是咱们会创造近100w个Row对象,且这些对象在短期内不能被垃圾回收,当程序执行完毕后,因为对象过大就会触发FullGC,致使发生Stop World,所以此时当前jvm的其余服务也会出现大量超时。

所以在处理excel的时候,务必先判断总行数、总大小,在作明细判断。

 

经过上述三个FullGC的处理场景,发如今发生FullGC的时候,大几率是跟咱们代码编写有关,所以如何可以熟练使用各类java命令、以及日志分析,对咱们可以快速定位问题是颇有帮助的。

同时此处在跟你们分享一个我的心得:全部问题排查均须要创建在对业务十分熟悉的状况下,不然将会走不少弯路,所以建议你们不要单纯盲目迷恋技术,业务+技术才是咱们立足的资本。

相关文章
相关标签/搜索