Java - JVM 会在哪些情况下突然崩溃?

3

我正在我的Ubuntu机器上运行一个守护进程java进程:

java -cp (...) &> err.log&

该进程运行随机时间后突然消失。日志中没有任何信息,也没有创建JVM崩溃文件(hs_err_*.log),没有异常。我的两个问题:

1)在什么情况下,Java进程会突然结束?

2)是否有办法知道进程发生了什么(知道PID)?UNIX是否以某种方式保留有关已完成进程的信息?


你尝试过运行JConsole吗?它提供了一些有用的信息,可能会有所帮助。 - Chetter Hummin
1
你确定它是崩溃了而不是正常退出了吗? - Philipp Reichart
有没有一种方法可以在应用程序退出时添加堆栈跟踪? - noli
宇宙射线可能会翻转非ECC内存上的一个危险位 :) - Adam Gent
3个回答

3

1) 在哪些情况下,Java进程会突然结束?

当它自己退出时,但我猜你排除了这种情况,或者当它被使用SIGKILL杀死时。如果您在Linux上,则可能是OOM killer。您是否查看系统消息日志?

2) 有没有办法知道发生了什么事(知道PID)?

通常不行,除非您配置一些跟踪工具以获取该信息。

UNIX是否以某种方式保留已完成进程的信息?

否,但取决于您使用的Unix变体,这可能是一个简单的添加。在您的示例中,您可以使用echo $?打印进程退出状态。

如果是265,那么意味着使用信号9杀死了该进程(=265-256)。


0

我会将其作为守护进程运行,使用YAJSW,因为它允许多种方式监视内存等,具有重启选项,您还可以在包装器进程上启用日志记录,这样在出现问题时就可以获得更多信息。


0

我会编写一个简单的shell脚本,以某种方式在JVM终止时提醒我。也许发送一封带有JVM退出代码的电子邮件。

#!/bin/sh

# Launch JVM and wait...
java -cp ...

# do something with the exit code $?
# log it to a file or mail it yourself

也许,退出代码可能会揭示一些信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接