Android 4.0 GC不一致-未释放位图

Android 4.0 GC不一致-未释放位图,android,bitmap,garbage-collection,Android,Bitmap,Garbage Collection,我知道这个问题已经讨论了很多,但我找不到解决我记忆问题的方法 问题是,在安卓4.0中,垃圾收集器不起作用(至少我开始这么认为)。下面是acer iconia平板电脑(4.0,48M堆)和motorola defy(2.2,30M堆)的快照跟踪,与我的代码中的情况大致相同。也就是说,从游戏中获得下一阶段->丢弃旧图像并将新图像加载到内存中 4.0 请注意以下几行: debugSaveMemInfo: D:23.61 N:2.12 O:2.65 ClearBitmapsFromMemory: 7

我知道这个问题已经讨论了很多,但我找不到解决我记忆问题的方法

问题是,在安卓4.0中,垃圾收集器不起作用(至少我开始这么认为)。下面是acer iconia平板电脑(4.0,48M堆)和motorola defy(2.2,30M堆)的快照跟踪,与我的代码中的情况大致相同。也就是说,从游戏中获得下一阶段->丢弃旧图像并将新图像加载到内存中

4.0

请注意以下几行:

debugSaveMemInfo: D:23.61  N:2.12  O:2.65
ClearBitmapsFromMemory: 7 friends  20 foes  2 GFIs
debugSaveMemInfo: D:23.61  N:2.12  O:2.6
vs

为了解密这些痕迹,我是这样得到内存信息的:

Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memInfo);
double nativeMem = memInfo.nativePss/(double)1024;
double otherMem = memInfo.otherPss/(double)1024;
double dalvikMem = memInfo.dalvikPss/(double)1024;
//some formatting...
Log.v(LOG_TAG, "debugSaveMemInfo: D:" + dalvik + "  N:" + nativeM + "  O:" + other);
从内存中清除位图如下所示:

// Bitmap mBitmap
mBitmap.recycle();
mBitmap = null;
是的,我已经在这两个平台上调试了代码,在我的代码中,一切都以完全相同的方式进行。因此,如果有人还在读这篇文章,就会产生一些问题。为什么在4.0中循环使用位图不会释放任何内存?GC不应该在抛出OoM之前找到所有可用内存吗?如果我完全减少使用的内存量,以防止OoM,那么这些位图最终会被释放。但不是在我需要记忆的时候


为了让事情变得更有趣,我从一个案例中获取了一个hprof文件,其中鬼位图在内存中,而你知道吗,它们不是!内存分析器说,当我将2300万个数字打印到屏幕上,并从9M的分配中获得OoM时,dalvik堆在同一时刻大约为10M。我对这里的想法不太了解,所以欢迎提出任何建议。我想我的下一个解决方案是,如果我的OoM设置正确的话,会降低图像质量,所以经过一些认真的思考,我现在认为Debug.MemoryInfo在4.0中有点慢。(我试图在问题发生时保留和释放内存,但这两种情况都没有出现在MemoryInfo中)。虽然最初的问题仍然存在,但原因更可能是堆碎片,而不是实际的GC失败。不幸的是,我没有找到任何好的解决办法。所以,当我捕捉到OoM时,我只是将图像缩小,用户的背景变得模糊。下一次抓取大图像时,堆会被神奇地纠正,一切都会恢复正常
debugSaveMemInfo: D:2,73  N:3,36  O:15,97
ClearBitmapsFromMemory: 7 friends  20 foes  2 GFIs
debugSaveMemInfo: D:2,73  N:3,36  O:9,02
Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memInfo);
double nativeMem = memInfo.nativePss/(double)1024;
double otherMem = memInfo.otherPss/(double)1024;
double dalvikMem = memInfo.dalvikPss/(double)1024;
//some formatting...
Log.v(LOG_TAG, "debugSaveMemInfo: D:" + dalvik + "  N:" + nativeM + "  O:" + other);
// Bitmap mBitmap
mBitmap.recycle();
mBitmap = null;