查找和纠正大堆大小的原因

我试图找出为什么我的应用程序使用这么多的内存。 我经常在15到18MB之间看到它,这比我想象的要高得多。 我通过DDMS看了一下堆的大小,看到这个:

在这里输入图像说明

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

在这里输入图像说明

我完全不知道为什么sPreloadedDrawables负责如此高的保留堆大小。 我也不知道如何识别根本原因,或者如何“修复”它。

我应该从哪里出发? 我的应用程序主要在后台通过服务,根本不处理图像数据。 我有活动,用户可以select使用,但他们再次使用小绘图,这不能解释这么大的堆大小。 我也检查了活动泄漏等任何讨厌的事件,但没有find任何。

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

系统将预先加载默认的系统资源,这与您的应用程序资源无关,如checkbox和单选button的标准Drawables。 10.5MB似乎确实很大,但是有很多默认的系统资源,一旦存储在内存中,图像就会变大。 预加载不是新的,但ICS中的预加载大小可能更大。 显示密度可能起着一部分作用,只是在ICS中预装了更多的系统Drawables。

目前还没有办法减lesssPreloadedDrawables的内存

不幸的是,在应用程序进程不适用于大多数系统Drawable的应用程序(特别是游戏)之后,没有办法清除这个问题。 在这种情况下,尽pipe预加载资源的大尺寸似乎是ICS特定版本(或手机端口)的bug。 否则通常是less量的内存,所以我怀疑是否有必要有这样的机制来减less预加载内存的使用。

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

如果您对更多的内部细节感兴趣,可以在这里跟踪资源预加载过程。 ZygoteInit.preloadResources