Java 如何找出JVM在linux上忽略kill-15(SIGTERM)的原因?

Java 如何找出JVM在linux上忽略kill-15(SIGTERM)的原因?,java,linux,jvm,Java,Linux,Jvm,我正在工作的jvm上执行kill-15,它似乎完全被忽略了 环境是: Linux 2.6内核 jdk 1.6.0_20-x86-64 项目中没有对sun.misc.SignalHandler的引用。我所掌握的唯一(相当蹩脚的)线索是调用main中的AbstractApplicationContext.RegisterSutdownhook()。JVM启动参数不包含任何与信号处理相关的内容 日志中没有任何内容(调试级别),也没有针对kill-15打印到stdout的内容 如何找出忽略SIGTE

我正在工作的jvm上执行
kill-15
,它似乎完全被忽略了

环境是:

  • Linux 2.6内核
  • jdk 1.6.0_20-x86-64
项目中没有对
sun.misc.SignalHandler
的引用。我所掌握的唯一(相当蹩脚的)线索是调用main中的
AbstractApplicationContext.RegisterSutdownhook()
。JVM启动参数不包含任何与信号处理相关的内容

日志中没有任何内容(调试级别),也没有针对
kill-15
打印到stdout的内容

如何找出忽略SIGTERM的原因

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

由于jvm没有退出,您可能需要检查是否存在:

  • 任何使用

  • JVM启动时存在-Xrs选项

  • sun.misc.SignalHandler的任何使用

  • 以下是Spring源代码中的AbstractApplicationContext.RegisterSutdownhook()

    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);
    }
    }
    

    唯一的钩子用法是在SpringApplicationContext中。spring关闭过程是否可能阻止jvm关闭?是的,它调用Runtime.addShutdownHook。代码添加。