Java应用程序停止或崩溃时的侦听器

Java应用程序停止或崩溃时的侦听器,java,jar,listener,Java,Jar,Listener,我在网上搜索过,但没有找到结果。我正在寻找一个监听器,当一个jar崩溃/停止时,它被称为。我知道他们的JFrame是这样的,但我没有使用Frame。 谢谢,艾弗里 查看java.lang.Runtime,方法 void addShutdownHook(Thread hook) 它的javadoc中只有一句话(,但请务必阅读其中所有的小字体):当虚拟机开始其关闭序列时,它将以一些未指定的顺序启动所有注册的关闭挂钩,并让它们同时运行 以下是由堆栈溢出引发的“崩溃”: static void rec

我在网上搜索过,但没有找到结果。我正在寻找一个监听器,当一个jar崩溃/停止时,它被称为。我知道他们的JFrame是这样的,但我没有使用Frame。
谢谢,艾弗里

查看java.lang.Runtime,方法

void addShutdownHook(Thread hook)
它的javadoc中只有一句话(,但请务必阅读其中所有的小字体):当虚拟机开始其关闭序列时,它将以一些未指定的顺序启动所有注册的关闭挂钩,并让它们同时运行

以下是由堆栈溢出引发的“崩溃”:

static void rec(){ rec(); }

public static void main( String[] args ){

    Thread thread = new Thread(){
        public void run(){
            System.out.println( "SHUTDOWN" );
        }
    };
    Runtime.getRuntime().addShutdownHook( thread );
    rec();
}
它打印的是关机

下面是一个应用程序,它使用与以前相同的关机钩子,可以使用Ctrl-C或Linux风格的
kill%1来终止BG作业:

Runtime.getRuntime().addShutdownHook( thread );
try {
    System.out.println( "Sleeping" );
    Thread.sleep( 5000);
    System.out.println( "Waking" );
} catch( Exception e ){
}
它打印的是关机

最后,这里是引发
java.lang.OutOfMemoryError的问题:java堆空间

List<Object> objs = new ArrayList<>();
while( true ){
    objs.add( new byte[0x10000000] );
}
List objs=new ArrayList();
while(true){
添加(新字节[0x10000000]);
}

它打印的是关机。(通过大量抓取堆空间,shutdown钩子甚至可以创建一些新对象。但是应该编写它,以便线程在其肚子中已经有了所有需要的对象,并带有预先分配的内存。)

查看java.lang.Runtime,方法

void addShutdownHook(Thread hook)
它的javadoc中只有一句话(,但请务必阅读其中所有的小字体):当虚拟机开始其关闭序列时,它将以一些未指定的顺序启动所有注册的关闭挂钩,并让它们同时运行

以下是由堆栈溢出引发的“崩溃”:

static void rec(){ rec(); }

public static void main( String[] args ){

    Thread thread = new Thread(){
        public void run(){
            System.out.println( "SHUTDOWN" );
        }
    };
    Runtime.getRuntime().addShutdownHook( thread );
    rec();
}
它打印的是关机

下面是一个应用程序,它使用与以前相同的关机钩子,可以使用Ctrl-C或Linux风格的
kill%1来终止BG作业:

Runtime.getRuntime().addShutdownHook( thread );
try {
    System.out.println( "Sleeping" );
    Thread.sleep( 5000);
    System.out.println( "Waking" );
} catch( Exception e ){
}
它打印的是关机

最后,这里是引发
java.lang.OutOfMemoryError的问题:java堆空间

List<Object> objs = new ArrayList<>();
while( true ){
    objs.add( new byte[0x10000000] );
}
List objs=new ArrayList();
while(true){
添加(新字节[0x10000000]);
}

它打印的是关机。(通过大量占用堆空间,关机钩子甚至可以创建一些新对象。但是应该编写它,这样线程就已经有了所有需要的对象,并且有了预先分配的内存。)

如果你的应用程序崩溃或使用kill命令停止,它将无法工作。@Stanislav添加了一些演示。不知道你所说的“崩溃”或“停止”是什么意思。很明显,如果JVM本身内存不足,关闭钩子将不会执行,但是什么也不会执行。我的意思是,您可能内存不足,或者进程被SIGKILL信号终止。在这种情况下,将不调用shutdownhook。此外,必须小心使用关闭钩子,只要看看javadoc,就会发现它有一些特定的行为,例如,如果需要很长时间,它就不能执行到最后,因为JVM没有等待它完成。我只是想,如果你给出这个解决方案,你必须提供关于这种特定行为的信息。我希望这是令人满意的Re-SIGKILL:如果我使用
javax&
启动应用程序,然后执行
kill%1
,就会执行关闭钩子。我认为,如果线程本身不需要堆空间,你甚至有可能堆空间不足。@Stanislav,正如我所想:即使堆内存不足,也会执行钩子。如果你的应用程序崩溃或使用kill命令停止,它将不起作用。@Stanislav添加了一些演示。不知道你所说的“崩溃”或“停止”是什么意思。很明显,如果JVM本身内存不足,关闭钩子将不会执行,但是什么也不会执行。我的意思是,您可能内存不足,或者进程被SIGKILL信号终止。在这种情况下,将不调用shutdownhook。此外,必须小心使用关闭钩子,只要看看javadoc,就会发现它有一些特定的行为,例如,如果需要很长时间,它就不能执行到最后,因为JVM没有等待它完成。我只是想,如果你给出这个解决方案,你必须提供关于这种特定行为的信息。我希望这是令人满意的Re-SIGKILL:如果我使用
javax&
启动应用程序,然后执行
kill%1
,就会执行关闭钩子。我认为,如果线程本身不需要堆空间,你甚至有可能堆空间耗尽。@Stanislav,正如我所想:即使堆内存耗尽,也会执行钩子。编辑标题:“jar”不是描述它的最佳词汇,希望你同意。编辑标题:“jar”不是描述它的最佳词汇,希望你能接受。