1

当我从 bash 脚本运行我的 java 程序时,有时我会收到一条消息:

MyProgram.bash: line 30:  4388 Killed

我将 bash 的参数设为最大值:

ulimit -Ss unlimited
ulimit -Sc unlimited
ulimit -Sn 4096

但是当我在执行后按 CTRL+C 时,我有这个错误:

OpenJDK 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGINT to handler- the VM may need to be forcibly terminated

我添加了这些信息,当我在另一台机器上运行具有相同参数的相同程序时,我没有这个异常!我用这些参数运行我的程序(我的内存中有 5Go)

jvmargs="-d64 -Xms512m -Xmx3G -Xss1G"

我的算法占用大量内存,因为我使用序列化。那么为什么我杀死了消息,而不是一个例外OutOfMemoryError呢?我能做些什么来解决问题?为什么当我在另一台具有相同参数的机器上运行时它可以工作?

4

2 回答 2

4

重新阅读该错误消息:

OpenJDK 64 位服务器 VM 警告:发生异常 java.lang.OutOfMemoryError 将信号 SIGINT 分派到处理程序 - 可能需要强制终止 VM

如果 OpenJDK 无法正确处理中断信号(因为它完全内存不足),它可能会诉诸于自杀

于 2012-12-01T13:19:42.237 回答
2

如果一个进程因为内存不足、Segfault 或其他导致 Linux 杀死它的原因而被杀死,您将在 dmesg 和/或您的 /var/log/dmesg 或 /var/log/messages 中找到带有堆栈跟踪的问题描述日志文件。尝试在 linux 控制台输入 dmesg。

# dmesg
[4374940.147496] php-fpm[15522]: segfault at 10000004d8 ip 00000010000004d8 sp 00007ffff9d41428 error 14 in libnss_dns.so.2[7ffe4d5a1000+5000]
[4375020.428429] soffice.bin[23336]: segfault at 48 ip 00007f8d63c566c0 sp 00007ffff529cc88 error 4 in libsvllo.so[7f8d63bb1000+108000]
于 2013-01-03T14:35:12.707 回答