通过MAT了解内存泄漏

时间:2014-02-05 18:09:47

标签: java android memory-leaks android-ndk

我是Android编程新手。随着时间的推移,可能android app的内存消耗显着增加。通过MAT分析时,它显示堆积的对象,其GC根为Native Stack。这些对象在本机代码中被引用为全局引用,但是随着时间的推移正确地发布我还放置了日志以确保计数匹配。 关于native stack的文档不太清楚,因为它只是声明:

  

本机代码中的in或out参数,例如用户定义的JNI代码或JVM内部代码。这通常是这种情况,因为许多方法具有本机部分,并且作为方法参数处理的对象成为GC根。例如,用于文件/网络I / O方法或反射的参数。

我不太清楚它说的是什么,问题出在哪里以及如何解决它。任何提示都非常感谢。提前谢谢。

1 个答案:

答案 0 :(得分:1)

这个答案不会给你一个明确的解决方案,不是因为我不愿意,而是因为它不可能(甚至更难,不仅仅是查看你的代码,而是非常了解你的代码)。但根据我的经验,我可以告诉你,由于直接引用的对象不会发生那种内存泄漏 - 你声明的对象(并继续引用另一个类/对象)依赖于许多其他类等等,并且可能您看到由于对任何实例的错误处理而导致内存泄漏,同时引用其他实例。

调试内存泄漏通常是一项非常艰苦的工作,不仅仅是因为正如我上面所述,它有时并不直接依赖于您声明的内容,而且因为找到解决方案可能并非易事。您可以做的最好的事情就是您似乎正在做的事情:DDMS + HPROF。我不知道你有多少知识,但是虽然它不是一种通用的方法,this link帮助我找到了代码中的内存泄漏。

虽然看起来微不足道,但调试这类事情的最佳方法是逐步删除代码的一部分(总体而言,意味着使用其他类的实例)并查看HPROF报告的更改方式。

----编辑----

SO上的question是说明GC根源的一个很好的例子。