首页 文章

Android位图分配怪异

提问于
浏览
2

我在理解为什么这段代码时遇到了一些麻烦

public class BitmapAllocTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        byte[] b = new byte[20 * 1000 * 1000];
        b = null;
        Bitmap.createBitmap(2500, 2000, Bitmap.Config.ARGB_8888);
    }
}

在具有24mb堆限制的设备上抛出OutOfMemory异常 . 如果我注释掉任何一个分配它运行正常 . 我的印象是java vm会在抛出OutOfMemory异常之前尝试垃圾收集 .

我怀疑它与android在本机堆上分配位图有关 .

2 回答

  • 0

    我在问题跟踪器上发布了这个并得到了这个答案:

    有几件事情正在发生 . 旧设备上的VM使用保守的集合 . 运行> = 2.0的大多数(但不是全部)设备将使用类型精确的GC,但它们中没有一个具有实时精确的GC . 这意味着,你设置“b = null”的事实并不能保证那个引用的所有副本都不见了 - 副本可能仍然位于某个地方的寄存器中,并且没有活动检测,GC无法知道永远不会再使用它 . 编译器丢弃“b = null”赋值也是完全合法的,因为你再也不会看“b”了 . 位图像素数据使用神奇的“外部分配”机制而不是通常的堆分配器 . 有时你会得到不愉快的互动 . 我们正在努力解决所有这些问题 .

    链接:http://code.google.com/p/android/issues/detail?id=10821

  • 1

    我的印象是java vm会在抛出OutOfMemory异常之前尝试进行垃圾收集 .

    您必须自己触发GC并重试 . 我最近不得不这样做,无法想出另一种方法 .

相关问题