如何找出为什么JVM忽略在Linux上kill -15(SIGTERM)?

我正在kill -15 <PID>在我的工作jvm,它似乎完全被忽略。

环境是:

  • Linux 2.6内核
  • jdk 1.6.0_20-x86-64

项目中没有提及sun.misc.SignalHandler 。 我唯一的(相当蹩脚的)线索是调用AbstractApplicationContext.registerShutdownHook()在main中。 JVM启动参数不包含与信号处理相关的任何内容。

日志中没有任何东西(DEBUG级别),没有什么打印到标准输出反应kill -15

如何找出什么原因会忽略SIGTERM?

通常,JVM线程上的信号1(SIGHUP),2(SIGINT),4(SIGILL),7(SIGBUS),8(SIGFPE),11(SIGSEGV)和15(SIGTERM)会导致JVM关闭; 因此,应用程序信号处理程序不应该尝试从这些中恢复,除非不再需要JVM。

既然你的jvm没有退出,你可能需要检查是否有:

  1. 任何使用Runtime.addShutdownHook

  2. JVM启动时存在-Xrs选项

  3. 任何使用sun.misc.SignalHandler。

这是Spring源代码中的AbstractApplicationContext.registerShutdownHook()。

 public void registerShutdownHook() { if (this.shutdownHook == null) { // No shutdown hook registered yet. this.shutdownHook = new Thread() { @Override public void run() { doClose(); } }; Runtime.getRuntime().addShutdownHook(this.shutdownHook); } }