2015-04-21 95 views
2

阅读了很多关于MAT后,我用我的生产堆转储分析内存泄漏问题。这是在泄漏报告错误:内存泄漏:如何解决

The thread org.apache.tomcat.util.threads.TaskThread @ 0x6d8be0a30 http-bio-8443-exec-115 keeps local variables with total size 3,695,816,440 (89.03%) bytes.

The memory is accumulated in one instance of "java.lang.Object[]" loaded by "'<'system class loader'>".

支配树摘要显示以下内容:

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

其实,我们不能帮你这个样子,如果你想解决的泄漏问题,你必须得到很多投入,比如GC细节,线程转储等

但是,我可以建议做到以下几点:

从你的投入,我可以告诉你的泄漏问题造成该得到通过一定的方法填补,它似乎有一个循环或复杂的业务或任何其他因素的局部变量。

Please note: that the GC root for local variable will be alwas the its parent thread itself.

在这种情况下,你必须得到该线程的stacktrace,它会告诉你究竟该线程是干什么的,这样你就可以开始从他们的调查。

+0

感谢您的答复。堆栈跟踪中指出,从数据库中获取其他和someEntity填写SomeDTO,没有什么方法。 – sMajeed