【问题标题】:Not sure why I'm getting a segfault in Java/Android when declaring an array不知道为什么在声明数组时我会在 Java/Android 中出现段错误
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 尝试这个很有趣。即使我删除了 colorData 数组,在使用 System.gc() 进行几次迭代后,该程序仍然崩溃......不知道为什么......
    • 所以即使我没有分配东西,当我强制垃圾回收时它仍然会崩溃(同样的错误)
    • 废话。如果 DVM 需要内存,它将运行 GC。调用 System.gc() 是无操作的。
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多