Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android位图分配怪异_Android_Bitmap_Out Of Memory - Fatal编程技术网

Android位图分配怪异

Android位图分配怪异,android,bitmap,out-of-memory,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[

我很难理解为什么会出现这种代码

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); } } 公共类BitmapAllocTest扩展活动{ /**在首次创建活动时调用*/ @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState);
字节[]b=新字节[20*1000*1000]; b=零; createBitmap(2500,2000,Bitmap.Config.ARGB_8888); } } 在具有24mb堆限制的设备上引发OutOfMemory异常。如果我注释掉任何一个分配,它运行良好。我的印象是,JavaVM会在抛出OfMemory异常之前尝试进行垃圾收集

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

我的印象是java vm会在抛出OfMemory异常之前尝试进行垃圾收集。
您必须自己触发GC并重试。我最近不得不这么做,但找不到另一种方法来做。

我将此贴在问题追踪器上,得到了以下答案:

有两件事正在发生

旧设备上的VM使用 保守的收藏。大多数(但 并非所有运行>=2.0的设备都将 使用类型精确的GC,但不使用任何类型 然而,我们仍然生活在这里

这意味着,你 设置“b=null”并不能保证 那个参考资料的所有副本都不见了 --一份副本可能还在某个地方的登记簿上,而且没有 GC无法知道的活性检测 它将永远不再被使用。 这也是完全合法的 编译器放弃“b=null” 因为你从来不看“b” 再说一遍

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

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


链接:

在分配位图之前,我尝试了您的建议调用System.gc(),也尝试了捕获错误,调用gc(),然后再次尝试分配位图。尽管如此,我仍然得到了OOM错误:(byte[]b=new byte[20*1000*1000];b=null;System.gc();尝试{Bitmap.createBitmap(2500,2000,Bitmap.Config.argb8888);}catch(OutOfMemoryError){System.gc();Bitmap.createBitmap(2500,2000,Bitmap.Config.argb8888);}嗯…我有多个位图,在调用GC之前循环使用每个位图,这在你的情况下是不可能的…我想对数组进行置零不足以让GC对其进行grep。只是猜测而已