前言
在java中通过使用Runtime.getRuntime().addShutdownHook(Thread hook)方式,向JVM中注册一系列shutdownHook,当JVM关闭时,会一一调用注册的hook,通过利用这一特性,我们可以在钩子中做资源的回收和释放等操作。
使用示例
以下是jdk中java.util.logging.LogManager实现的部分代码:public class LogManager {
static {
try {
Runtime.getRuntime().addShutdownHook(new Cleaner());
} catch (IllegalStateException e) {
// If the VM is already shutting down,
// We do not need to register shutdownHook.
}
}
//内部类(jvm退出时,做资源回收释放,状态为重置等操作)
private class Cleaner extends Thread {
public void run() {
LogManager mgr = manager;
synchronized (LogManager.this) {
deathImminent = true;
initializedGlobalHandlers = true;
}
// Do a reset to close all active handlers.
reset();
}
}
}
调用的场景
- 程序正常退出;
- 使用System.exit()退出;
- 终端控制台使用Ctrl+C触发的中断;
- 系统关闭;
- OutOfMemory引起的宕机;
- 使用Kill pid命令干掉进程(注:使用kill -9 pid强杀时,不会被调用);