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

Ash*_*win 10 android memory-leaks memory-management

当应用程序从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
Run Code Online (Sandbox Code Playgroud)

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

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

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

hjm*_*hjm 14

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

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

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

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

希望这可以帮助 ;)

  • @Ashwin嗯,我想问题出在其他地方.顺便说一句,PNG只是一种压缩图像的方式,以便更容易地传输它们.当需要在屏幕上显示时,需要解压缩.所以重要的不是kb的大小,而是图像的维度.1个像素占用一定的内存,具体取决于位图设置,但如果使用ARGB_8888,它将占用每像素32位.使用PNG只会帮助您的apk文件更小.确保你的图像不是太大. (3认同)

Amo*_*tir 10

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

例如,尝试将您Bitmap的样本提高两倍:

BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 2;
Bitmap b = BitmapFactory.decodeFile(pathToBitmap, o);
Run Code Online (Sandbox Code Playgroud)