我知道这个问题已经讨论了很多,但我找不到解决方案/解决我的记忆问题。
问题是在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
则降低图像质量