【发布时间】:2013-02-04 11:12:48
【问题描述】:
所以我有一些代码在 Android 中崩溃,我不知道为什么。
while(true)
{
byte[] colorData = new byte[480*800];
colorData = null;
System.out.println("what");
}
它会打印 3 次“what”,然后以“Fatal Signal 11 SIGSEGV”崩溃(见此处:http://i.imgur.com/FYAsi2C.png)。它肯定是在运行垃圾回收,所以问题似乎不是内存耗尽,但是如果我降低数组的大小,崩溃需要更长的时间。
如果我删除 colorData 行,则代码可以正常工作并且不会崩溃。我很困惑。可能是其他一些代码,但我不明白为什么添加/删除数组声明会导致程序崩溃/不崩溃。
有什么想法吗?
编辑:
因此,当我通过增加字节数组大小来强制程序耗尽内存时,会出现内存不足异常。到底是什么导致了这个段错误?
【问题讨论】:
-
你一直在“while (true)”运行这段代码,内存会超出。
-
在内存受限的平台上创建数百万个对象确实不是一个好主意。
-
它运行了 3 次并且崩溃了,所以我不会认为它是“创建数百万个对象”。正如您从我发布的 imgur 链接中看到的那样,它似乎正在运行垃圾收集,并且有足够的可用内存(超过 1 兆字节)来分配 400k 块。它也应该在迭代之间对它们进行 GC,它似乎正在这样做,但它仍然在崩溃。
-
另外,当我删除数组分配时,当我添加 System.gc() 时它仍然崩溃,它失败并出现同样的错误。这没有意义
-
DVM 永远不应该出现段错误。它当然不应该出现段错误,因为它内存不足。 ...并且它不应该用完内存分配和取消分配数组。 ...而且在分配和释放 3 次之后肯定不应该这样做。请看一下核心转储,如果你能抓住它,如下面的 M Vladmirov 所述。知道这里发生了什么会很有趣。
标签: java android memory segmentation-fault