1

所以我有一些代码在 Android 中崩溃,我不知道为什么。

while(true)
{
    byte[] colorData = new byte[480*800];
    colorData = null;
    System.out.println("what");
}

它打印出“什么”三遍,然后以“致命信号 11 SIGSEGV”崩溃(如下所示:http: //i.imgur.com/FYAsi2C.png)。它肯定在运行垃圾收集,所以问题似乎不是内存耗尽,但如果我降低数组的大小,崩溃需要更长的时间。

如果我删除 colorData 行,则代码可以正常工作并且不会崩溃。我很困惑。它可能是其他一些代码,但我不明白为什么添加/删除数组声明会导致程序崩溃/不崩溃。

有任何想法吗?

编辑:

因此,当我通过增加字节数组大小来强制程序耗尽内存时,我会遇到内存不足异常。到底是什么导致了这个段错误?

4

2 回答 2

1

Java 通常会在 SIGSEGV 上生成崩溃日志文件。.core 文件也在 *nix 系统上生成。这些文件可用于了解它崩溃的位置的堆栈跟踪,其中许多导致问题来源。

您的代码对我来说很好(Windows 7 上的 64 位 JDK 1.7.0_13)。它不应该耗尽内存,因为分配的字节数组在循环的下一次迭代中变得未被引用,并将被 GC 收集。

无论如何,如果您希望人们帮助您,您需要提供更多信息。至少包括以下内容:java 版本(运行“java -version”)、OS 版本(在 Windows 上运行“ver”或在 *nix 上运行“uname -a”)、JVM 生成的崩溃日志文件、完整的源代码跑步。

于 2013-02-04T11:21:33.230 回答
1

设置 colorData=null 后尝试添加 System.gc()。这应该强制释放对象。

于 2013-02-04T11:26:39.477 回答