一、JVM中的关闭
1. 详解虚拟机钩子
在Java进程开发中,对于重量级的系统资源关闭或者进程资源整理或信号输出,常常会通过Java内置的addShutdownHook方法注册回调函数,确保在Java进程关闭不再使用这些资源时将其释放,例如hutool这个工具类对应连接池的管理工具GlobalDSFactory,其底层就会在类加载初始化时利用addShutdownHook注册一个连接池销毁的回调函数:
/*
* 设置在JVM关闭时关闭所有数据库连接
*/
static {
// JVM关闭时关闭所有连接池
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
if (null != factory) {
factory.destroy();
StaticLog.debug("DataSource: [{}] destroyed.", factory.dataSourceName);
factory = null;
}
}
});
}
而虚拟机钩子注册的原理本质上就是在调用addShutdownHook时,其底层将这个现场hook注册到一个hooks的map容器中,并在shutdown的时候遍历调用这些hook线程:
对应