查找和纠正大堆大小的原因
我试图找出为什么我的应用程序使用这么多的内存。 我经常在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
- 当一个项目被按下时如何closures抽屉?
- 如何设置gradle和android studio来进行发布构build?
- Android开关部件textOn和textOff在棒棒糖中不起作用
- 我怎样才能模拟加速度计在Android模拟器?
- 访问Google API – GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken()
- animation片段和后面的堆栈
- 为什么hierarchyviewer不能用于Samsung Galaxy TAB 7.0?
- android.mk arm-linux-androideabi-g ++exception和__cxa_allocate_exception
- 在Android中使用枚举