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

时间:2012-08-15 20:03:43

标签: android bitmap garbage-collection

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

问题是在android 4.0中垃圾colletor不起作用(至少我开始相信这样)。以下是来自acer iconia平板电脑(4.0,48M堆)和motorola defy(2.2,30M堆)的快照跟踪,与我的代码中的情况相同。也就是说,从游戏中获得下一个阶段 - >抛弃旧图像并将新图像加载到内存中。

4.0

08-15 21:33:07.020: V/ThemePacket(25564): debugSaveMemInfo: D:23.61  N:2.12  O:2.65

08-15 21:33:07.020: ThemePacket(25564): ClearBitmapsFromMemory: 7 friends  20 foes  2 GFIs

08-15 21:33:07.050: D/dalvikvm(25564): GC_EXPLICIT freed 4K, 74% free 10909K/41671K, paused 2ms+3ms

08-15 21:33:07.260: V/ThemePacket(25564): debugSaveMemInfo: D:23.61  N:2.12  O:2.65

08-15 21:33:07.260: V/DrawableResourceDataReference(25564): Bitmap size is: w:1875 h:1250 Asking for: w:1215 h:780

08-15 21:33:07.280: D/dalvikvm(25564): GC_FOR_ALLOC freed 36K, 74% free 10940K/41671K, paused 18ms

08-15 21:33:07.410: I/dalvikvm-heap(25564): Forcing collection of SoftReferences for 9375016-byte allocation

08-15 21:33:07.450: D/dalvikvm(25564): GC_BEFORE_OOM freed <1K, 74% free 10940K/41671K, paused 44ms

08-15 21:33:07.510: E/dalvikvm-heap(25564): Out of memory on a 9375016-byte allocation.

2.2

08-15 22:10:53.132: V/ThemePacket(15074): GetStage(1)

08-15 22:10:53.155: V/ThemePacket(15074): debugSaveMemInfo: D:2,73  N:3,36  O:15,97

08-15 22:10:53.155: V/ThemePacket(15074): ClearBitmapsFromMemory: 7 friends  20 foes  2 GFIs

08-15 22:10:53.218: D/dalvikvm(15074): GC_EXPLICIT freed 911 objects / 115904 bytes in 54ms

08-15 22:10:53.241: V/ThemePacket(15074): debugSaveMemInfo: D:2,73  N:3,36  O:9,02

08-15 22:10:53.241: V/DrawableResourceDataReference(15074): Bitmap size is: w:1875 h:1250 Asking for: w:885 h:600

08-15 22:10:53.241: V/DrawableResourceDataReference(15074): Scaling down by 2

// all goes fine

请注意以下几行:

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

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;

是的,我已经在两个平台上调试了代码,并且在我的代码中一切都完全相同。因此,如果有人还在读这个,那么就会出现一些问题。为什么在4.0中回收位图不会释放任何内存? GC是不是想在抛出OoM之前找到每一块空闲内存?如果我减少完全使用的内存量,以便我防止OoM,那么这些位图最终会被释放。但不是在我需要记忆的时候......

为了让事情变得更有趣,我从一个幽灵位图在内存中的情况下获取了一个hprof文件,你知道它们是什么,它们不是!内存分析器说,当我将这23M数字打印到屏幕并从9M分配中获得OoM时,dalvik堆大约为10M。我在这里有点想法,所以欢迎任何建议。我想我的下一个解决方案是如果我得到OoM

则降低图像质量

0 个答案:

没有答案