一、了解一下JVM关闭
通常而言,对于JVM的关闭我们很少去关注,但是了解JVM的关闭能帮我们在JVM关闭时做一些合理的事情。首先JVM的关闭方式可以分为一下几种:
1)程序正常退出
2)使用System.exit()
3)终端使用Ctrl+C触发的中断
4)系统关闭
5)使用Kill pid命令干掉进程
6)子线程异常对其他子线程、主线程以及hook都不影响;主线程异常也一样;hook线程中出现异常,则失效
二、Hook钩子关闭的代码实现
关闭钩子本质上是一个线程(也称为Hook线程),用来监听JVM的关闭。通过使用Runtime的addShutdownHook(Thread hook)可以向JVM注册一个关闭钩子。Hook线程在JVM 正常关闭才会执行,在强制关闭时不会执行。
@Test
public void testHook() {
Thread jvmClear = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("jvm关闭前执行,可以进行内存清理")