JVM 关闭钩子

1、功能

在jvm中添加关闭钩子(Runtime.getRuntime().addShutdownHook(shutdownHook);)后,当jvm关闭时会执行系统中已经设置的所有通过该方法添加的钩子,系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁、关闭I/O资源等操作。

2、示例

示例1及输出:

package cn.edu.buaa.jvmhook;

/**
 * Runtime.getRuntime().addShutdownHook(shutdownHook);
 * <p>
 * 这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,
 * 当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。
 * </p>
 * 用途1:应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作。
 */
public class JVMHook1 {

    public static void start() {
        System.out.println("The JVM is started");
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                try {
                    // do something
                    System.out.println("The JVM Hook is execute");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static void main(String[] args) {
        start();

        System.out.println("The Application is doing something");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        while (true) {
            ;
        }
    }
}

The JVM is started
The Application is doing something

示例2及输出:

package cn.edu.buaa.jvmhook;

/**
 * Runtime.getRuntime().addShutdownHook(shutdownHook);
 * <p>
 * 这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,
 * 当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。
 * </p>
 * 用途2:虚拟机非正常退出,比如用户按下ctrl+c、OutofMemory宕机、操作系统关闭等。在退出时执行必要的挽救措施。
 */
public class JVMHook2 {
    public static void start() {
        System.out.println("The JVM is started");
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                try {
                    // do something
                    System.out.println("The JVM Hook is execute");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static void main(String[] args) {
        start();

        System.out.println("The Application is doing something");

        byte[] b = new byte[-1];

        System.out.println("The Application continues to do something");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

The JVM is started
The Application is doing something
Exception in thread "main" java.lang.NegativeArraySizeException
    at cn.edu.buaa.jvmhook.JVMHook2.main(JVMHook2.java:31)
The JVM Hook is execute

建议

同一个JVM最好只使用一个关闭钩子,而不是每个服务都使用一个不同的关闭钩子,使用多个关闭钩子可能会出现当前这个钩子所要依赖的服务可能已经被另外一个关闭钩子关闭了。为了避免这种情况,建议关闭操作在单个线程中串行执行,从而避免了再关闭操作之间出现竞态条件或者死锁等问题。

3、参考资料

http://www.cnblogs.com/langtianya/p/4300282.html

时间: 2024-08-09 19:50:47

JVM 关闭钩子的相关文章

JVM 关闭前执行命令的钩子

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { System.out.println("bbbbb"); } }, "bb thread")); 可添加多个,在jvm 关闭之前会调用这些钩子. 使用场景:清理某些资源或者关闭连接.

java的关闭钩子(Shutdown Hook)

Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭.所以这些钩子可以在jvm关闭的时候进行内存清理.对象销毁等操作. 用途 1应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作.   2虚拟机非正常退出,比如用户按下ctrl+c

JAVA虚拟机关闭钩子(Shutdown Hook)

Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用: 程序正常退出 使用System.exit() 终端使用Ctrl+C触发的中断 系统关闭 OutOfMemory宕机 使用Kill pid命令干掉进程(注

Java关闭钩子

Java关闭钩子 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源的功能. 使用Runtime.addShutdownHook(Thread hook)向JVM添加关闭钩子 public void addShutdownHook(Thread hook) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("shu

Java关闭钩子的应用 - Shutdown Hook

背景 在开发中,遇到这种情况,多个线程同时工作,突然一个线程遇到了fetal的错误,需要立即终止程序,等人工排查解决了问题之后重新启动.但是这样会有一个问题,程序终止时,其他线程可能正在进行重要操作,比如发一个message到另一个模块,并更新数据库状态.突然终止,可能会让这个操作只完成一半,从而导致数据不一致. 解决方案是:参考数据库Transaction原子性的概念,将这一系列重要操作看作一个整体,要么全部完成,要么全部不完成.为方便表述,我们把这一系列重要操作记为操作X. 当程序即将退出时

注册 jvm 关闭时操作

? 1 2 // 注册 jvm 关闭时操作 Runtime.getRuntime().addShutdownHook(new Thread(){ public void run() { System.out.println("关闭"); } }); 注册 jvm 关闭时操作,布布扣,bubuko.com

监听JVM关闭

使用Runtime的addShutdownHook(thread)方法: 1 for(int i=0; i<5; i++){ 2 System.out.println(i); 3 } 4 5 Thread th = new Thread(new Runnable() { 6 7 @Override 8 public void run() { 9 System.out.println("jvm结束了..."); 10 } 11 }); 12 //设置监听线程 13 Runtime.

Tomcat 关闭钩子

使用JAVA的过程中,经常遇到程序启动时初始化一下资源,或生成一下临时文件,程序退出时要清除这些临时文件,或者程序退出时执行一下必要的其他操作.如果程序是通过我们提供的关闭/退出按钮正常退出的,一切还都好处理,但是如果用户直接关闭虚拟机运行的窗口,那一切就会变的比较复杂. 好在java提供了一种优雅的方式去解决这种问题.使得关闭的善后处理的代码能执行.java的关闭钩子能确保总是执行,无论用户如何终止应用程序.除非用户kill,这个是个死穴. 对java而言,虚拟机会对以下几种操作进行关闭: (

tomat(16)关闭钩子

[0]REAMDE 0)本文部分文字描述转自:"how tomcat works",旨在学习"tomat(16)关闭钩子"的相关知识: 1)problem+solution: 1.1)problem:在很多实际环境中,当用户关闭应用程序时,并不会按照推荐的方法关闭应用程序,很有可能不做清理工作: 1.2)solution:java 为程序员提供了一种优雅的方法可以在在关闭过程中执行一些代码,以确保那些负责善后处理的代码可能能够执行: 2)在java中,虚拟机会对两类