为什么我的Java程序在重负载下没有任何错误消息时关闭?

sda*_*das 1 java crash

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

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

我收到错误消息 - 但不是每次崩溃都发生.我收到的两条错误消息是:

[太多错误,中止]

#Java Runtime Environment检测到致命错误:

#

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

#

#JRE版本:6.0_24-b24

#Java VM:OpenJDK 64位服务器VM(20.0-b12混合模式linux-amd64压缩oops)

#衍生物:IcedTea6 1.11.5

#Distribution: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;

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

任何帮助表示赞赏.

chu*_*ubs 5

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

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