【问题标题】:Why does my Java program shut down without any error messages under heavy load?为什么我的 Java 程序在高负载下关闭而没有任何错误消息?
【发布时间】:2012-11-14 13:59:39
【问题描述】:

当我加载一个相当大的文件时,我的 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;

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

感谢任何帮助。

【问题讨论】:

    标签: java crash


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      看起来很可能是OutOfMemoryException,尽管我承认 Eclipse 通常会报告这些。

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

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

      【讨论】:

      • 我相信这是问题所在。感谢你们俩(chubbsondubs)-我将其授予您,因为您快了一分钟。谢谢!
      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 2013-01-05
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2023-02-01
      • 2012-11-21
      相关资源
      最近更新 更多