【发布时间】:2016-07-05 13:54:21
【问题描述】:
解码可绘制图像资源 960x926px jpg,分配 3555856 字节时出现奇怪的内存不足错误。 图像仅放置在 drawable-xxhdpi (3x) 中,我使用的是 hdpi (1.5x) 设备。 两个问题:
为什么堆中有足够的可用内存却出现错误?
分配给 hdpi 设备应该是 ((960/2) x (926/2)) x 4 = 888960 字节(不是 3555856)?
谁能解释一下?
注意:问题是为什么要获得 3.5MB 分配的 OOM,同时拥有 22.5MB 可用内存(请参阅日志)
03-18 17:30:15.050 32750-32750/? D/dalvikvm: GC_FOR_ALLOC 已释放 10809K,49% 空闲 23735K/46087K,暂停 89ms,总共 89ms
03-18 17:30:15.050 32750-32750/? I/dalvikvm-heap:强制收集 3555856 字节分配的软引用数
03-18 17:30:15.160 32750-32750/? D/dalvikvm:GC_BEFORE_OOM 释放 29K, 49% 免费 23705K/46087K,暂停 103ms,共 103ms
03-18 17:30:15.160 32750-32750/? E/dalvikvm-heap: 内存不足 3555856 字节分配。
03-18 17:30:15.160 32750-32750/?我/dalvikvm:“主要”prio=5 tid=1 可运行
03-18 17:30:15.160 32750-32750/?我/dalvikvm: |组=“主”sCount=0 dsCount=0 obj=0x418fc6a0 self=0x4010c008
03-18 17:30:15.160 32750-32750/?我/dalvikvm: | sysTid=32750 不错=1 sched=0/0 cgrp=apps 句柄=1075251280
03-18 17:30:15.160 32750-32750/?我/dalvikvm: | schedstat=( 0 0 0 ) utm=3807 stm=859 核心=0
03-18 17:30:15.160 32750-32750/?我/dalvikvm:在 android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
03-18 17:30:15.160 32750-32750/?我/dalvikvm:在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:636)
03-18 17:30:15.160 32750-32750/?我/dalvikvm:在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:484) 03-18 17:30:15.160 32750-32750/?我/dalvikvm:在 android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:512)
03-18 17:30:15.160 32750-32750/?我/dalvikvm:在 android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:542)
【问题讨论】:
-
如果你使用android模拟器,你在堆中设置了多少内存?
-
@Khang .NT 4 我使用的是 48M 堆大小的真实设备
-
“为什么我在堆中有足够的空闲内存时得到错误?” -- 堆上没有足够大的块来满足您的请求。 Dalvik 垃圾收集器不是压缩垃圾收集器,这意味着堆会变得碎片化。 ART 的垃圾收集器将压缩堆,以便分配更大的块,但仅限于应用程序在后台时。
-
@CommonsWare 有没有办法检查堆的分段状态?
-
很遗憾,没有。
标签: android android-image android-bitmap bitmapfactory android-memory