JVM的关闭方式可以分为三种:
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站设计、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的平南网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
1.正常关闭:当最后一个非守护线程结束、或者调用了System.exit、或者通过其他特定平台的方法关闭(发送SIGINT,SIGTERM信号等)
2.强制关闭:通过调用Runtime.halt方法、或者是在操作系统中直接kill(发送SIGKILL信号)掉JVM进程
3.异常关闭:运行中遇到RuntimeException异常、OOM错误等。
通常JVM可使用runtime.addShutdownHook()对退出信号做处理,它让我们在程序正常退出或者发生异常时能有机会做一些清场工作。关闭钩子其实可以看成是一个已经初始化了的但还没启动的线程,当JVM关闭时会并发无序地执行注册的所有关闭钩子。
Runtime.getRuntime().addShutdownHook(handleThread); //handleThread是信号处理线程。
ShutdownHook响应的信号如下:
注意事项:
用户可以自定义SignalHander对特定信号进行处理。
class MySignalHandler implements SignalHandler
{
public static void listenTo(String name) {
Signal signal = new Signal(name);
Signal.handle(signal, new MySignalHandler());
}
public void handle(Signal signal) {
System.out.println("Signal: " + signal);
if (signal.toString().trim().equals("SIGTERM")) {
System.out.println("SIGTERM raised, terminating...");
System.exit(1);
}
}
}
Java对每个信号都启动一个线程进行处理。注册TERM信号,就启动"SIGTERM handler" 线程。即便主线程被阻塞,信号依然可以得到处理。由于对信号的处理是多线程的,所以应保证信号处理实例SignalHandler应该是线程安全的。
由于ShutdownHook的并发无序执行,所以我们在优雅关闭时不能直接kill -15,比如有残留请求的情况,如果部分资源已关闭,那么残留请求的执行会有异常。 正确流程如下:
这里的优雅就体现在第一步的10秒kill -12,在资源都正常的情况下给业务一些时间来正常关闭服务。
我们以转转的RPC框架ZZSCF为例,来看其是如何实现优雅关闭的。
首先,我们进行kil -12并等待10秒,用户自定义SignalHandler来处理12信号,而且此时所有的资源都是正常状态。
图片
图片
图片
图片
图片
图片
接着,我们进行kil -15并等待10秒。这时会并发无序执行注册的ShutdownHook,进行一些资源的释放,很有可能不需要10sJVM就退出了。
最后,如果kill -15还没有终止JVM,则直接强制退出。
这里附赠常用JVM的重启脚本。
用法:./main.sh start|stop|restart|kill|status
查看源码链接:https://github.com/waterystone/shell_test/blob/main/jvm/main.sh
本文标题:JVM应用优雅上下线,再也不担心抖动了
文章出自:http://www.shufengxianlan.com/qtweb/news42/225892.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联