在未处理的异常期间JVM会发出什么信号?

时间:2014-09-29 20:42:00

标签: java unix signals

在未处理的异常期间,JVM会引发什么信号(SIGTERMSIGINT,...)?

例如,异常可能是java.lang.NumberFormatException

1 个答案:

答案 0 :(得分:2)

未处理的异常不一定会导致JVM发出信号 - 这是不必要的:Java系统代码捕获异常并在那里处理(打印堆栈跟踪并退出)。

在某些情况下,JVM会发出信号以调用信号处理程序来记录更多诊断信息。

另一方面,Oracle JVM(例如)安装信号处理程序以捕获一些特定错误并将其转换为异常 - 有关详细信息,请参阅here

编辑以跟进上面的注释,并基于指向源的链接(尽管您没有显示调用失败的Java程序AFAICT的脚本):

您安装的陷阱会导致shell解释器安装信号处理程序,以防它接收到SIGINT / ...如果子进程收到这样的信号,它们就不会被调用(加注导致有问题的进程接收信号 - 指示你需要使用杀人和朋友的另一个过程。

因此,即使JVM发出信号,shell也不会得到它。

在你的情况下可能发生的事情是bash被配置为在出错时退出(例如set -o errexit),因此锁定释放代码不会因为未处理而导致JVM的退出代码为非null而无法执行例外。

要解决此问题,请将ERR(可能是EXIT)添加到陷阱调用的signal_spec中。