在阅读了很多关于MAT的内容之后,我使用了生产堆转储来分析内存泄漏问题。这是泄漏报告错误:
线程 org.apache.tomcat.util.threads.TaskThread @ 0x6d8be0a30 http-bio-8443-exec-115 保持局部变量的总大小 3,695,816,440(89.03%) bytes。
内存累积在" java.lang.Object []" 的一个实例中 由"''系统类加载器'>" 加载。
统治者树摘要显示以下内容:
org.apache.tomcat.util.threads.TaskThread @ 0x6d8be0a30 http-bio-8443-exec-115 SH:112 RH:3,695,816,440 Prct:89.03% java.util.ArrayList @ 0x6da437cd8 SH:24 RH:3,695,668,184 Prct:89.03% java.lang.Object[1823230] @ 0x77da34ee8 SH:7,292,936 RH:3,695,668,160 Prct:89.03% com.cjs.persistence.dto.SomeDTO @ 0x76f631650 SH:360 RH:2,264 Prct:0.00% com.cjs.persistence.dto.SomeDTO @ 0x750ed8f88 SH:360 RH:2,264 Prct:0.00% ...
GC根目录的路径显示了线程本身。我无法找到导致这种情况的原因以及为什么要保留这些DTO列表以及如何清除它们。任何建议都非常感谢。
答案 0 :(得分:0)
实际上,我们无法帮助您这样做,如果您想解决泄漏问题,您必须获得许多输入,例如GC
详细信息,线程转储等。
但是,我建议你做以下事情:
根据您的输入,我可以判断您的泄漏问题是由通过某种方法填充的局部变量引起的,并且它似乎有一个循环或复杂的业务或任何其他因素。
请注意:,本地变量的
GC
根将是其父线程本身。
在这种情况下,您必须获取该线程的stacktrace
,它将显示该线程正在做什么,因此您可以从他们开始调查。