我有一个应用程序在线程中获取位图,然后将位图放入全局内存缓存中。在 2.2 模拟器上,加载足够的位图(它们在列表视图中)后,我得到一个可重现的内存不足错误:
FATAL EXCEPTION: pool-1-thread-1
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
...
堆看起来很稳定(3.3mb),我想知道我是否看不到内存量的增长,因为我认为在 2.2 操作系统中,位图内存是单独存储的?我一直在做 hprof 转储并在 MAT 中查看它们,我的对象计数看起来符合预期。
在 ICS 手机上运行应用程序不会出现同样的问题(但是,可能只是有更多的内存等)。我认为在后来的操作系统中,他们将位图内存作为堆的一部分?
无论哪种情况,有没有办法查看我的应用程序分配了哪些 Bitmap 实例?我认为 hprof 转储仅显示系统范围内的总计数。但是我看不到它们是从哪里分配的。
我在用着:
android.support.v4.util.LruCache<String, Bitmap>
作为一个内存缓存 - 在条目被驱逐后,位图数据似乎没有被清理(我将缓存设置为 5mb 上限)。我记得 Bitmap 上有像 recycle() 这样的方法,也许它们没有被正确清理?
谢谢