基本概念

进程与线程:一个进程包含多个线程,一个进程中所有线程都退出后,该进程才会退出。

用户线程与守护线程:任一用户线程未退出,JVM进程不退出,当所有用户线程都退出时,
守护线程线程自动退出。

Shutdown hook:进程退出时执行的钩子,主要用来清理释放资源使进程友好的退出。为了避免强制退出JVM可能产生的各种问题,我们可以采用Shutdownhook、发出信号的方式,主动的通知JVM退出,并在JVM关闭前,执行应用程序的一些扫尾工作,进一步保证应用程序可以安全的退出。

Linux下与结束进程相关的信号量

名称 编号 功能
SIGINT 2 中断(同 Ctrl + C)会触发触发shutdownhook
SIGKILL 9 终止进程,强制杀死进程
SIGTERM 15 终止进程,会先释放自己的资源,触发shutdownhook然后终止进程

Shutdown hook例子

    public class TestShutdownHook {public static void main(final String[] args) throws InterruptedException {Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {System.out.println("Shutdown hook ran!");}});while (true) {Thread.sleep(1000);}}}

在linux环境下执行如上述代码,当通过kill -15 pid,kill -2 pid结束该Java进程时ShutdownHook会被调用。但Kill -9 pid不会触发ShutdownHook调用。当通过kill -9去结束一个Java进程时,则需要通过另一个程序来判断进程是否被关闭。例如通过shell脚本。

#!/bin/bash java TestShutdownHook wait # notify your other app that you quit echo "TestShutdownHook quit"

不友好的shutdown hook

shutdown hook内部陷入死循环,或被block住,会使进程无法退出。

public class Main {public static void main(String[] args) throws Throwable {Runtime.getRuntime().addShutdownHook(new Thread(() -> {while (true) {try {TimeUnit.SECONDS.sleep(1);System.out.println("shutdown");}catch (Exception e) {}}}));}
}

这种情况结合外部程序或脚本可以先发出kill -15,kill -2 如果一段时间内检测到进程未关闭,那么再发出kill -9来结束进程。

参考

https://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal-in-java?noredirect=1&lq=1

Java 进程的退出机制与Shutdown hook相关推荐

  1. java hook全局钩子,牛逼骚操作:Java 虚拟机关闭钩子(Shutdown Hook)!

    码农每日一题 长按关注,工作日每天分享一个技术知识点. Shutdown Hooks 是一种特殊的结构,它允许开发人员插入 JVM 关闭时执行的一段代码. 用途 Application 正常退出(所有 ...

  2. java 进程撤销_2020-08-12 如何优雅关闭java进程

    kill -l可以看到信号列表 列表 kill -9 pid 可以直接杀死pid的进程,不过这种方式太暴力了.可能会出现: 请求丢失:内存队列中等待执行请求丢失 数据丢失:处于内存缓存中数据未持久化到 ...

  3. 如何优雅地停止Java进程

    目录 理解停止Java进程的本质 应该如何正确地停止Java进程 如何注册关闭钩子 使用关闭钩子的注意事项 信号量机制 总结 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境 ...

  4. vmx进程已提前退出_如何优雅地停止Java进程

    目录 理解停止Java进程的本质 应该如何正确地停止Java进程如何注册关闭钩子使用关闭钩子的注意事项信号量机制 总结 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境,即: ...

  5. JAVA优雅的退出机制

    JAVA优雅的退出机制 参考: Netty 优雅退出机制和原理 Java 优雅地退出程序 每天一个linux命令(42):kill命令 一.JAVA进程退出时机: 虚拟机中可能同时有多个线程运行,只有 ...

  6. java8:关闭钩子shutdown hook

    参考资料: <Java中的关闭钩子(shutdown hook)> <JVM 的关闭钩子> 写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正. 目录 ...

  7. nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)

    作者:俩右 出处:https://segmentfault.com/a/1190000038298447 源码点击 study:https://github.com/xiaoshuanglee/stu ...

  8. Java Review - Java进程内部的消息中间件_Event Bus设计模式

    文章目录 概述 EventBus架构类图 Code Bus接口 (定义注册topic以及发送event接口) 自定义注解-回调方法及topic 同步EventBus 异步EventBus Subscr ...

  9. Java进程占用内存超高分析

    Java进程占用内存超高分析_ 1. 报错 2. 解决 3. 我用到的解决方法 写了一个Java服务,没有定时服务,没有线程池,没有重度的读写,只是对外提供了几个接口,接口的访问量并不高,结果占用内存 ...

最新文章

  1. 不同类的方法 事务问题_深入理解 Spring 事务原理
  2. SonarQube6.2源码解析(一)
  3. java 上传文件及预览_SpringBoot上传下载文件及在线预览
  4. 微软获 OpenAI 独家 GPT-3 模型授权,为何马斯克炮轰?
  5. JavaWeb进度报告1
  6. Compilation failed: internal java compiler error
  7. 11.go 环境变量
  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_4_缓冲流的效率测试_复制文件...
  9. 最新免费计算机编程视频教程
  10. Hi3518ev200使用HiTool下载程序
  11. 3dMax导入unity 材质问题
  12. 测试山石防火墙 接口中 逆向路由 设置与urpf是否有关
  13. python 分析单细胞数据教程 scanpy---初探
  14. [ffmpeg] 视频码率压缩
  15. asc超级计算机题目,通知公告|2019 ASC 世界大学生超级计算机竞赛(ASC19)报名通知|信息与软件工程学院...
  16. 库卡机器人emd价格_什么是机器人零点标定?以kuka机器人为例
  17. modelsim vopt
  18. linux查看服务器电源风扇,nagios监控vsphere ESXi主机硬件状态(CPU风扇、电源模块、硬盘、温度)...
  19. win7ie11调用java失败,win7纯净版系统下ie11无法加载java插件
  20. 原生_H5交互插件(适用于与V2.1)

热门文章

  1. 【计网【题目】一个大公司有一个总部和三个下属部门。公司分配到的网络前缀是192.77.33/24.
  2. Golang helloWord
  3. uCore学习笔记-Lab0
  4. 合众达SEED-DEC138工作环境配置
  5. 学习 PySOT(2)(PySOT-toolkit、对比、画图)
  6. 三阶四阶魔方自动复原程序(Java)
  7. 计算机主板上方便用户自己安装,计算机主板,也叫系统板或母板。主板上装有组成电脑的主要电路系统,是计算机硬件系统的的主板部件中,方便用户自己可以安装的部件是__________。...
  8. Istio、eBPF 和 RSocket Broker:深入研究服务网格
  9. 基于RSocket协议实现客户端与服务端通信
  10. el-table去掉滚动条和斑马纹颜色修改