我知道这个主题已经讨论了很多,但我找不到我的内存问题的解决方法/解决方案。
问题是在 android 4.0 中垃圾收集器不起作用(至少我开始相信如此)。下面是我的代码中关于相同情况的 acer iconia tablet(4.0, 48M heap) 和 motorola defy(2.2, 30M heap) 的快照跟踪。也就是说,从游戏中获取下一阶段 -> 丢弃旧图像并将新图像加载到内存中。
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
对比
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 就降低图像质量