1

当我加载一个相当大的文件时,我的 Java 程序崩溃(在 Eclipse 中)。

我已经运行了 VisualVM,并且我的 CPU 在崩溃之前似乎达到了 20% 的峰值使用率,而且我的堆大小似乎并不太高。崩溃时运行的线程数约为 20。

我确实收到错误消息 - 但不是每次发生崩溃时。我收到的两条错误消息是:

[错误太多,中止]

# Java 运行时环境检测到一个致命错误:

#

# SIGSEGV (0xb) at pc=0x00007f096d096942, pid=12102, tid=139678234564352

#

# JRE 版本:6.0_24-b24

# Java VM:OpenJDK 64-Bit Server VM(20.0-b12混合模式linux-amd64压缩oops)

# 衍生产品:IcedTea6 1.11.5

# 发行版:Ubuntu 12.04 LTS,包 6b24-1.11.5-0ubuntu1~12.04.1

# 有问题的框架:

# J java.util.HashMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

我找到了与第二个警告有关的线程,但它似乎表明存在硬件问题。我相信我的错误出在软件中,因为它似乎只发生在较大输入文件的特定实例中。

任何帮助表示赞赏。

4

2 回答 2

5

如果 JVM 被授予使用 X 数量内存的权限,它将会崩溃,但系统没有更多的内存可以给它。例如,您说它可以使用 512MB (-Xmx512m),而您的程序的堆仅使用 128MB。应该允许再分配 384MB。然而,当它去分配更多的内存时,机器会被窃听,而操作系统说不,JVM会在这些情况下崩溃。查看 CPU 使用率和堆大小看起来很正常,但问题是机器没有更多的内存可以给它。因此,当发生这种情况时,请检查您的总内存和可用内存,看看您是否只是内存不足。

有趣的是,如果您降低 JVM 上的上层内存 (-Xmx),它可能会阻止它崩溃,因为它会在分配更多内存之前强制 Java 进行 GC。但是将它降低得太远,它会运行缓慢或只是抛出 OOM 异常。这就是为什么选择不太大或太小的尺寸对于您的应用程序有效运行很重要的原因。您还可以考虑预先分配更多,或更改您的程序以更有效地使用内存。你会想要关闭那些占用你的内存的进程,这些进程不是你的应用程序的核心,或者只是购买更多的内存。

于 2012-11-27T01:13:05.283 回答
3

似乎它可能是一个OutOfMemoryException,尽管我承认 Eclipse 通常会报告这些。

但是请注意,已启动应用程序的堆大小与 IDE 本身的堆大小不同,并且默认值非常小(不记得了,但并不大)。

查看默认启动配置文件的 VM 设置,或更改应用程序特定启动的 VM 以添加大量堆-Xmx1G或其他内容

于 2012-11-27T01:12:12.770 回答