我正在尝试弄清为什么我的应用程序占用了如此多的内存。我经常看到它使用15到18MB之间的内存,这大大高于我的预期。我通过DDMS查看了堆大小,并看到了以下内容:

这看起来有点可疑,因为我的应用程序根本不处理大图像。实际上,我的应用程序中可绘制对象的总和约为250KB。因此,我创建了一个堆转储,并使用MAT定位了所有这些内存的去向。 byte []数组是迄今为止最大的使用者,因此我深入研究并注意到以下内容:

我完全不知道为什么sPreloadedDrawables会导致如此高的保留堆大小。我也不知道如何确定根本原因或如何“解决”它。

我应该从这里去哪里?我的应用程序通过完全不处理图像数据的服务在后台运行。我确实有一些 Activity 可供用户选择使用,但是同样,他们使用的小可绘制对象无法解释这么大的堆大小。我还检查了 Activity 泄漏等是否有任何令人讨厌的事件,但没有找到。

编辑:我注意到,在模拟器中运行时,堆大小大大降低。这很令人困惑。 :/

最佳答案

系统将预加载默认的系统资源,这与您的应用程序资源无关,例如复选框和单选按钮的标准Drawables之类的东西。 10.5MB看起来确实很大,但是有很多默认系统资源,并且一旦存储在内存中,图像就会更大。预加载并不新鲜,但是在ICS中预加载的大小可能会更大。显示密度可能是其中的一部分,而仅仅是在ICS中预加载了更多的系统Drawables。

当前无法减少sPreloadedDrawables保留的内存

不幸的是,在未使用大多数系统可绘制对象的应用程序(尤其是游戏)产生应用程序进程后,没有任何方法可以清除此问题。在这种情况下,尽管预加载资源很大,但这似乎是ICS特定版本(或手机端口)的错误。否则它通常是少量的内存,因此我怀疑是否有必要使用这种机制来减少预加载内存的使用。

如果由于此缓存而导致内存不足,那么我可能会向Google提交错误报告。

如果您对更多内部详细信息感兴趣,可以在此处跟踪资源预加载过程。 ZygoteInit.preloadResources

关于android - 查找和纠正堆大的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9653457/

10-10 18:44