我在理解为什么这段代码时遇到了一些麻烦
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在本机堆上分配位图有关。
答案 0 :(得分:1)
我在问题跟踪器上发布了这个并得到了这个答案:
还有很多事情要发生。
旧设备上的VM使用 保守的收藏。大多数(但是 并非所有设备运行> = 2.0将 使用类型精确的GC,但没有一个 但是有精确的GC。
这意味着什么,你这个事实 设置“b = null”不保证 该参考文献的所有副本都不见了 - 副本可能仍然位于某个地方的寄存器中,没有 活着检测GC无法知道 永远不会再使用它。 它也完全合法 编译器丢弃“b = null” 因为你永远不会看“b” 试。
位图像素数据使用神奇 相反,“外部分配”机制 比通常的堆分配器。 有时你会感到不愉快 相互作用。
我们正在努力解决所有这些问题 的问题。
答案 1 :(得分:0)
我的印象是java vm在抛出OutOfMemory异常之前会尝试进行垃圾收集。
您必须自己触发GC并重试。我最近不得不这样做,无法想出另一种方法。