找到浪费记忆的课程

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

在此处输入图像描述

为了找到引起这个问题的类/活动或代码片段,我发现MAT(内存分析工具)插件很有用,但它确实让我感到困惑,请考虑下面的图像:

在此处输入图像描述

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

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

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

在此处输入图像描述

那么我怎样才能找到使用这些内存的内容呢?

当Android应用程序启动时,它会inheritance由Zygote分配的对象 – 这是一种使应用程序更快生成的技巧。 所以当你得到一个内存转储时,它们会显示为你自己的。

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

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

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

有关来自最终资源的MAT /字节数组使用情况分析的更具体示例,请参阅此答案 。

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