Android - Grow Heap (Frag Case) - Byte Allocation.. 不加载任何位图
Posted
技术标签:
【中文标题】Android - Grow Heap (Frag Case) - Byte Allocation.. 不加载任何位图【英文标题】:Android - Grow Heap (Frag Case) - Byte Allocation.. Not Loading any bitmaps 【发布时间】:2012-05-25 00:35:36 【问题描述】:当应用从启动画面加载到主页时会发生这种情况。它只发生在设备上而不是模拟器上:
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
有没有人遇到过这种情况?有人可以提供一些专业知识....
【问题讨论】:
您正在加载的位图大小是多少? 【参考方案1】:您可能正试图解码一个非常大的Bitmap
,这会导致OutOfMemory
异常。这意味着您尝试实现的操作超出了设备上每个应用程序允许的 VM 预算,就堆内存消耗而言(在您的设备上似乎是 24 MB,在您的模拟器上可能更多,这就是为什么它没有不会发生在那里!)。
例如,尝试将您的 Bitmap
抽样为两倍:
BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 2;
Bitmap b = BitmapFactory.decodeFile(pathToBitmap, o);
【讨论】:
@AmitJayaswal 感谢您指出这一点,我已编辑。它是一个字符串,表示要解码的文件的路径。【参考方案2】:我遇到了同样的问题并找到了解决方案。
您是从资源中加载位图吗?如果是这样,请尝试将它们放在相应的可绘制文件夹中,而不是将它们保存在“drawable”或“drawable-mdpi”中。
当您将图像资源放在普通的可绘制文件夹中时,对于系统来说,这意味着可绘制-mdpi。因此具有高或超高 dpi 的设备(我认为 Galaxy Nexus 是超高的)将扩展该资源以匹配设备的 dpi。
如果您的资源只有 1 个尺寸,请将它们放在 drawable-nodpi 中,它将按原样使用。但是您的某些布局可能会受到此影响,因此我将某些图像(如按钮图像等)保留在 drawable 文件夹中,并将背景和其他更大的资源移动到 drawable-nodpi 中。
希望这会有所帮助;)
【讨论】:
我将所有图像都放在 drawable-hdpi 文件夹中。但我在可绘制文件夹中有另一个 xml 文件,用于按钮的 stateChangingStyles。这些 xml 文件包含图像......这会引起关注吗? @Ashwin 在可绘制文件中包含 xml 文件应该不是问题。 hdpi 文件夹中存储的位图有多大?我建议您尝试将它们放入 xhdpi 或 no-dpi 中,看看是否会出现相同类型的错误。 我将图像更改为建议的文件夹,但没有效果。而且我所有的图片都是png格式的,我整个应用程序中最大的图片只有77kb。这没有意义,因为它在初始启动期间分配了 24 MB。 @Ashwin 嗯,我想问题出在其他地方。顺便说一句,PNG 只是一种压缩图像的方式,以便于传输。当它需要在屏幕上显示时,它需要被解压缩。所以重要的不是以 kb 为单位的大小,而是图像的尺寸。 1 个像素占用一定数量的内存,具体取决于位图设置,但如果您使用 ARGB_8888,它将占用每个像素 32 位。使用 PNG 只会帮助您的 apk 文件更小。确保您的图片不要太大。 @Ashwin 试试看这个答案。***.com/questions/7247049/android-grow-heap-frag-case以上是关于Android - Grow Heap (Frag Case) - Byte Allocation.. 不加载任何位图的主要内容,如果未能解决你的问题,请参考以下文章
内存测试——Android Studio中对应进程的Heap
android--------Eclipse中ddms heap内存分析工具