千家信息网

JAVA虚拟机怎么关闭钩子

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"JAVA虚拟机怎么关闭钩子"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java程序
千家信息网最后更新 2026年11月03日JAVA虚拟机怎么关闭钩子

本篇内容介绍了"JAVA虚拟机怎么关闭钩子"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。

JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用:

  1. 程序正常退出

  2. 使用System.exit()

  3. 终端使用Ctrl+C触发的中断

  4. 系统关闭

  5. OutOfMemory宕机

  6. 使用Kill pid命令干掉进程(注:在使用kill -9 pid时,是不会被调用的)

下面是JDK1.7中关于钩子的定义:

public void addShutdownHook(Thread hook)
参数:
hook - An initialized but unstarted Thread object
抛出:
IllegalArgumentException - If the specified hook has already been registered, or if it can be determined that the hook is already running or has already been run
IllegalStateException - If the virtual machine is already in the process of shutting down
SecurityException - If a security manager is present and it denies RuntimePermission("shutdownHooks")
从以下版本开始:
1.3
另请参见:
removeShutdownHook(java.lang.Thread), halt(int), exit(int)

首先来测试第一种,程序正常退出的情况:

package com.hook;

import java.util.concurrent.TimeUnit;

public class HookTest

{

public void start()

{

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

@Override

public void run()

{

System.out.println("Execute Hook.....");

}

}));

}


public static void main(String[] args)

{

new HookTest().start();

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


try

{

TimeUnit.MILLISECONDS.sleep(5000);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}


运行结果:

The Application is doing something Execute Hook.....

如上可以看到,当main线程运行结束之后就会调用关闭钩子。

下面再来测试第五种情况(顺序有点乱,表在意这些细节):


package com.hook;

import java.util.concurrent.TimeUnit;

public class HookTest2

{

public void start()

{

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

@Override

public void run()

{

System.out.println("Execute Hook.....");

}

}));

}


public static void main(String[] args)

{

new HookTest().start();

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

byte[] b = new byte[500*1024*1024];

try

{

TimeUnit.MILLISECONDS.sleep(5000);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

运行参数设置为:-Xmx20M 这样可以保证会有OutOfMemoryError的发生。

运行结果:

The Application is doing something Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.hook.HookTest2.main(HookTest2.java:22) Execute Hook.....

可以看到程序遇到内存溢出错误后调用关闭钩子,与第一种情况中,程序等待5000ms运行结束之后推出调用关闭钩子不同。

接下来再来测试第三种情况:


package com.hook;

import java.util.concurrent.TimeUnit;

public class HookTest3

{

public void start()

{

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

@Override

public void run()

{

System.out.println("Execute Hook.....");

}

}));

}


public static void main(String[] args)

{

new HookTest3().start();

Thread thread = new Thread(new Runnable(){

@Override

public void run()

{

while(true)

{

System.out.println("thread is running....");

try

{

TimeUnit.MILLISECONDS.sleep(100);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}


});

thread.start();

}

}

在命令行中编译:javac com/hook/HookTest3.java

在命令行中运行:java com.hook.HookTest3

运行结果:

可以看到效果如预期。

"JAVA虚拟机怎么关闭钩子"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

钩子 运行 情况 程序 命令 结果 测试 接下来 内容 参数 更多 知识 进程 不同 实用 学有所成 代码 内存 困境 场景 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州万易互联网科技有限公司 广州百单互联网科技有限公司 科技互联网产品 科技金融是不是互联网金融 厦门中拓互联网络科技有限公司 重庆互联网络科技 金融科技 互联网金融 狮子座互联网科技 华中科技大学互联网 电子科技大学互联网 成都互联网科技公司100强 佳云科技和互联网广告 世界互联网科技公司市值排名 电子科技大学互联网创业大赛 乌苏新华互联网科技做什么的 南博望互联网科技有限公司 保险科技服务互联网营销体系 互联网科技机房 山东蛋芒互联网科技有限公司 杭州科技互联网公司有哪些 苏州大垚互联网科技 郑州华宇互联网科技 中正互联网科技招聘 河南猎农互联网科技有限公司 互联网科技公司实习生 移动互联网年度科技创新 电子科技大学互联网创业大赛 允成互联网科技有限公司融资 区块链结合互联网科技 普陀区互联网教育科技管理办法
0