java内存溢出问题分析过程二(附MAT超全操作文档)

前言

java程序的性能问题定位,一直都是开发者需要面对的一个“拦路虎”,
在前面的两篇文章中,已经介绍了Heap dump的概念和生成方式,以及Shallow heap和Retained heap以及GC ROOT的概念,本篇文章,我们继续来介绍一些新的概念和基于一个dump案例,详尽的介绍,在程序OOM后,改如何去定位具体原因。

再次提及dominator tree(支配树)

如果你玩过竞技类游戏,肯定会很熟悉Dominating -主宰比赛这个单词。

file

在Memory Analyzer工具中提供了对象图的支配树。将对象引用图转换为dominator tree可以让轻松地确定Retained heap最大内存块和对象之间保持活动的依赖关系,相当于主宰了整个JVM的感觉。

我们把java对象之间的引用关系看做一张有向图,如果所有指向Y的对象路径都要经过X,则我们说X支配Y。如果X是离对象Y最近的支配对象,则我们说对象X是Y的直接支配者( immediate dominator)。

再强化记忆一下,X对象要直接支配Y,必须满足这两点:

  • 指向Y的对象路径都要经过X。
  • X对象是离Y最近的支配对象。
file

左边是对象的引用图,右边是支配树。

C节点的子树就是所有被C支配的节点的集合,也称为C的Retained Set。

由图可以看出,C是E的直接支配节点,所以C的上级支配节点B也可以支配E。

dump分析初步

首先用MemoryAnalyzer工具打开dump文件。

file

从整体情况可以看出,1.6 gb的堆内存,有大对象占了1.1g。

怀疑是有内存泄漏,我们通过Leak Suspect Report报告查看

file

内存泄漏分析报告显示有两项问题:

  • 一是WebappClassLoader 类加载器装载的A.A[][] 对象占了约1.2g(70.40%)。
  • 二是一个名为TP-Processor9的线程持有本地变量多达337M(占了19.58%)。

通过分析报告,我们初步可以推断出OOM的问题应该出在这两个地方,我们逐个击破。

内存泄漏点一

先来看类装载器加载的AA对象。我们点开内存泄漏报告的Detail,查看其详情。

Shortest Paths To the Accumulation Point视图可以看出正是和org.apache.catalina.loader.WebappClassLoader这个GC root相连导致当前Retained Heap占用相当大的对象无法被回收,而对象数量居然达到了170288个。

file

Accumulated Objects in Dominator Tree视图,可以看出AA对象中,到底是什么内嵌对象占用heap高。


file

可以看出,170288个AA对象数组内部,主要是AH对象 和 AM对象。

我们继续向下看,通过按class类分组,来看看具体占用比例情况。

file

按class分组后,冒出了一个Af对象,反倒AH占用不是那么多了。

小结:AH/AM/Af三个对象占用堆内存很高,并且它们的gc root是WebappClassLoader。

内存泄漏点二

file

TP-Processor9 线程本身就是GC root,故只有一条数据。

以这个线程为GC ROOT来看看,它的支配树是什么样的?

file

可以看到19.58%的Retained Heap就是来源于TP-Processor9 线程本身。这意味着,如果这个线程能被gc回收掉,则至少能释放19.58%的堆内存。

file

以TP-Processor9 线程为gc root的支配树,按class分类,可以发现Am对象本身占用163m左右。

file

Detail明细的最后由于当前怀疑泄露点为TP-Processor9 线程对象,故展示了线程明细信息,调用栈信息。

小结:TP-Processor9 线程内部可能导致内存泄漏。

整合两个泄漏点结论

从两个泄漏点,得出的结论,我们可以将问题定位到如下元素上:
TP-Processor9 线程、170288个AA对象数组、AM、AH对象。

我们来看看AA对象数组的(Outgoing Reference)引用其他外部对象的情况

file

可以看到com.fr.report.core.A.A[170288][] @ 0xcfdb62a0
这个对象引用外部对象的情况,一共是170289个
com.fr.report.core.A.A[25] 对象。

并且其Shallow Heap 和Retained Heap大小一样。
170289 * 120 = 20434680。 约占20M内存。

所以这个对象应用的外部对象,不是根因。

接下来,再分析Incomming Reference(被其他外部对象引用的情况)。

file

可以看到com.fr.report.core.A.A[170288][] @ 0xcfdb62a0

这个包含170288个元素的对象,主要被
com.fr.report.worksheet.PageRWorkSheet @ 0xcfd02188
对象持有。

出现了一系列的ReportPage和ClippedECPage对象。

file

从依赖树和对象地址可以知道,ClippedECPage引用ReportPage对象。

所以只需要重点关注ClippedECPage对象。继续分析ClippedECPage对象的依赖树如下:

其他的 Shallow Heap占用都不高,唯独一个对象数组,占用较大,并且它的Retained Heap很大。

问题应该就出在ClippedECPage类上,进一步分析它存储的
com.fr.page.ReportPage。
这个对象是:
用于展示及打印的页面 执行完一个多Sheet的Report后, 会生成多个ReportPage。
分析它的属性:

file

连续查看了两个对象,发现其中的属性,currentPageNumber为591和592。

file

总页数为599.
可以推断出,是在做分页操作。


file

可以看到当时浏览器的信息


file

操作的文件:xxx/customized/xxx表.xxx

结论

结合ReportPage类的作用:
用于展示及打印的页面 执行完一个多Sheet的Report后, 会生成多个ReportPage。

最后结论为:

在执行查询时间段为:
2018/6/8 15:57:15 - 2018/6/8 16:0:53时
一次性打印599页数据,导致OOM,程序宕机崩溃。

至此,就完成了一个Dump文件的分析,我准备了一个mat的操作手册,比较全面。


file

在微信侠梦的开发笔记中回复mat,即可领取,希望能帮助到你。

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

推荐阅读更多精彩内容