内存泄漏:如何解决

时间:2015-04-21 08:07:31

标签: java memory-leaks thread-local heap-dump

在阅读了很多关于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列表以及如何清除它们。任何建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

实际上,我们无法帮助您这样做,如果您想解决泄漏问题,您必须获得许多输入,例如GC详细信息,线程转储等。

但是,我建议你做以下事情:

根据您的输入,我可以判断您的泄漏问题是由通过某种方法填充的局部变量引起的,并且它似乎有一个循环或复杂的业务或任何其他因素。

  

请注意:,本地变量的GC根将是其父线程本身。

在这种情况下,您必须获取该线程的stacktrace,它将显示该线程正在做什么,因此您可以从他们开始调查。