Android - Grow Heap(Frag Case) - 字节分配..不加载任何位图

时间:2012-05-17 12:19:45

标签: android memory-management memory-leaks

当应用从Splash屏幕加载到Main页面时会发生这种情况。它只发生在不在模拟器上的设备上:

05-17 08:10:16.627: I/dalvikvm-heap(14021): Grow heap (frag case) to 20.580MB for     2424256-byte allocation
05-17 08:10:16.666: D/dalvikvm(14021): GC_FOR_ALLOC freed 1K, 3% free 21000K/21511K, paused 21ms
05-17 08:10:16.697: D/dalvikvm(14021): GC_CONCURRENT freed 116K, 3% free 20885K/21511K, paused 2ms+2ms
05-17 08:10:16.720: D/dalvikvm(14021): GC_FOR_ALLOC freed 44K, 4% free 20841K/21511K, paused 10ms
05-17 08:10:16.728: I/dalvikvm-heap(14021): Grow heap (frag case) to 24.533MB for 4310896-byte allocation

我使用了Ecplise MAT - 解析了字节分配--Android.Graphics.Bitmap $ preloaded images ...

我使用的设备是Google Nexus Prime,Android 4.0

有没有遇到过同样的人?有人可以抛出一些专业知识......

2 个答案:

答案 0 :(得分:14)

我遇到了同样的问题并找到了解决方案。

你是从资源加载你的位图吗?如果是这样,请尝试将它们放在相应的可绘制文件夹中,而不是将它们保存在“drawable”或“drawable-mdpi”中。

当您将图像资源放在普通的可绘制文件夹中时,对于系统来说,这意味着drawable-mdpi。因此,具有高或超高dpi的设备(我认为Galaxy Nexus为超高)将扩展该资源以匹配设备的dpi。

如果您的资源只有1个大小,请将它们放在drawable-nodpi中,它将按原样使用。但是你的一些布局可能会受到影响,因此我将某些图像保存在可绘制文件夹中(如按钮图像等),并将背景和其他更大的资源移动到drawable-nodpi中。

希望这会有所帮助;)

答案 1 :(得分:10)

您可能正在尝试解码一个非常大的Bitmap,这会导致OutOfMemory异常。这意味着您尝试实现的操作超出了设备上每个应用程序所允许的VM预算,就堆内存消耗而言(在您的设备上似乎是24 MB,在您的模拟器上可能更多,这就是为什么它没有不会发生在那里!)。

尝试以{2}为例将您的Bitmap示例:

BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 2;
Bitmap b = BitmapFactory.decodeFile(pathToBitmap, o);