1

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

问题是在 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 就降低图像质量

4

0 回答 0