找到浪费记忆的课程

时间:2013-04-25 12:30:34

标签: java android memory-management memory-leaks

几个月前我在Google Play上发布了一个应用程序,我的大多数用户对我的应用程序的内存使用情况都有很大的问题,这是真的,因为当我从“正在运行的应用程序”选项卡检查我的内存使用情况时,我看到它需要 80~110MB 的内存,如下图所示:

enter image description here

要查找导致此问题的类/活动或代码段,我发现MAT(内存分析工具)插件很有用,但它确实让我感到困惑,请考虑下面的图像:

enter image description here

已用内存的总大小为 9.8MB ,但“正在运行的应用程序”标签同时显示 80MB

另一个问题是直方图,byte[]对象的 Shallow Heap 太高。

这是正常的吗?此外,当我调试一些Google项目时,字节值总是太高了!

enter image description here

那么如何才能找到使用这些内存的内容呢?

2 个答案:

答案 0 :(得分:2)

当Android应用程序启动时,它会继承由Zygote分配的对象 - 一种使应用程序更快生成的技巧。因此,当你获得内存转储时,它们会显示为你自己的内存。

为什么Zygote拥有那么多内存分配的答案是让resource加载更快的另一个技巧。在Android启动期间,Zygote 预加载一些类和资源列表,因此所有其他应用程序不需要每次都加载它们。

请参阅ZygoteInit.java#330以实现此预加载。

大量使用字节数组是由于这个预加载的资源(即位图)。

有关确定资源中MAT /字节数组使用情况分析的更具体示例,请参阅此answer

答案 1 :(得分:0)

您是否尝试过使用visual vm?这是一个很好的教程,可以找出类和实例的内存使用情况(visual vm tutorial)。希望这会对你有所帮助。