-
一是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个。
Accumulated Objects in Dominator Tree视图,可以看出AA对象中,到底是什么内嵌对象占用heap高。
可以看出,170288个AA对象数组内部,主要是AH对象 和 AM对象。
我们继续向下看,通过按class类分组,来看看具体占用比例情况。
按class分组后,冒出了一个Af对象,反倒AH占用不是那么多了。
小结:AH/AM/Af三个对象占用堆内存很高,并且它们的gc root是WebappClassLoader。
内存泄漏点二
TP-Processor9 线程本身就是GC root,故只有一条数据。
以这个线程为GC ROOT来看看,它的支配树是什么样的?
可以看到19.58%的Retained Heap就是来源于TP-Processor9 线程本身。这意味着,如果这个线程能被gc回收掉,则至少能释放19.58%的堆内存。
以TP-Processor9 线程为gc root的支配树,按class分类,可以发现Am对象本身占用163m左右。
Detail明细的最后由于当前怀疑泄露点为TP-Processor9 线程对象,故展示了线程明细信息,调用栈信息。
小结:TP-Processor9 线程内部可能导致内存泄漏。
整合两个泄漏点结论
从两个泄漏点,得出的结论,我们可以将问题定位到如下元素上:TP-Processor9 线程、170288个AA对象数组、AM、AH对象。
我们来看看AA对象数组的(Outgoing Reference)引用其他外部对象的情况
可以看到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(被其他外部对象引用的情况)。
可以看到com.fr.report.core.A.A[170288][] @ 0xcfdb62a0
这个包含170288个元素的对象,主要被 com.fr.report.worksheet.PageRWorkSheet @ 0xcfd02188 对象持有。
出现了一系列的ReportPage和ClippedECPage对象。
从依赖树和对象地址可以知道,ClippedECPage引用ReportPage对象。
所以只需要重点关注ClippedECPage对象。继续分析ClippedECPage对象的依赖树如下:
其他的 Shallow Heap占用都不高,唯独一个对象数组,占用较大,并且它的Retained Heap很大。
问题应该就出在ClippedECPage类上,进一步分析它存储的 com.fr.page.ReportPage。这个对象是:用于展示及打印的页面 执行完一个多Sheet的Report后, 会生成多个ReportPage。分析它的属性:
连续查看了两个对象,发现其中的属性,currentPageNumber为591和592。
总页数为599. 可以推断出,是在做分页操作。
可以看到当时浏览器的信息
操作的文件:xxx/customized/xxx表.xxx
结论
–
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!