Android位图分配怪异

时间:2010-08-23 10:24:12

标签: android bitmap out-of-memory

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

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 :(得分:1)

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

  

还有很多事情要发生。

     

旧设备上的VM使用   保守的收藏。大多数(但是   并非所有设备运行> = 2.0将   使用类型精确的GC,但没有一个   但是有精确的GC。

     

这意味着什么,你这个事实   设置“b = null”不保证   该参考文献的所有副本都不见了    - 副本可能仍然位于某个地方的寄存器中,没有   活着检测GC无法知道   永远不会再使用它。   它也完全合法   编译器丢弃“b = null”   因为你永远不会看“b”   试。

     

位图像素数据使用神奇   相反,“外部分配”机制   比通常的堆分配器。   有时你会感到不愉快   相互作用。

     

我们正在努力解决所有这些问题   的问题。

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

答案 1 :(得分:0)

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

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