如何关掉java虚拟机_JVM安全退出(如何优雅的关闭java服务)

本文介绍了如何在Java中实现JVM的安全退出,以确保异步任务的完整执行,避免数据丢失和任务丢失。通过注册关闭钩子和利用信号通知机制,可以在应用程序关闭前执行必要的清理工作,从而实现优雅的关闭。
摘要由CSDN通过智能技术生成

背景用户:货都到了,购物车里怎么还有刚买的东西,what?

产品:有用户反映,提单完成了,怎么没清购物车,研发赶紧看看是不是有bug啊?

研发:恩,我看看,!@#¥%……&*()一顿狂查,搜嘎,当时在上线,重启应用,异步任务丢了……

产品:能不能行,上线你就丢任务,丢不丢人啊!

研发:…………

上线!重启!你还在为丢失任务而烦恼么?看这里看这里,从此不再丢任务,JVM可以安全退出的

在交易流程中,为了提升服务的性能,我们做了一些异步化的优化,比如更新用户最近使用的收货地址、提单完成后通过MQ去发送各种通知类消息、清理用户的购物车等等这些操作,异步化加快了应用的响应速度同时也带来一个隐患,如何保障异步操作的执行?这个场景主要发生在应用重启时,对于通过线程或线程池进行的异步化,JVM重启时,后台执行的异步操作可能尚未完成。这时,需要通过JVM安全关闭来保证异步操作进行完成后,JVM再执行关闭。

更广泛的说,在Linux上很多应用通常会通过kill -9 pid的方式强制将进程杀掉,这种方式简单高效,因此很多应用的停止脚本经常会选择使用kill -9 pid的方式。强制进程退出,会带来一些副作用,对应用程序而言其效果等同于突然掉电,可能会导致如下一些问题:缓存中的数据尚未持久化到磁盘中,导致数据丢失;

正在进行文件的write操作,没有更新完成,突然退出,导致文件损坏;

线程池的任务队列中尚有接收到的任务还没来得及处理,导致任务丢失;

数据库操作已经完成,例如账户余额更新,准备返回应答消息给客户端时,消息尚在通信线程的发送队列中排队等待发送,进程强制退出导致应答消息没有返回给客户端,客户端发起超时重试,会带来重复更新问题;

其它问题等…

这些问题都有可能对我们的业务产生影响,造成不必要的损失,为了避免这些问题,我们需要在JVM关闭时做些扫尾的工作,为此JVM提供了关闭钩子(shutdown hooks)来做这些事情。本文探讨了利用关闭钩子的相关内容。

JVM 关闭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值