成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM應(yīng)用優(yōu)雅上下線,再也不擔(dān)心抖動(dòng)了

開發(fā) 前端
通常JVM可使用runtime.addShutdownHook()對(duì)退出信號(hào)做處理,它讓我們?cè)诔绦蛘M顺龌蛘甙l(fā)生異常時(shí)能有機(jī)會(huì)做一些清場(chǎng)工作。

一、前言

JVM的關(guān)閉方式可以分為三種:

1.正常關(guān)閉:當(dāng)最后一個(gè)非守護(hù)線程結(jié)束、或者調(diào)用了System.exit、或者通過其他特定平臺(tái)的方法關(guān)閉(發(fā)送SIGINT,SIGTERM信號(hào)等)

2.強(qiáng)制關(guān)閉:通過調(diào)用Runtime.halt方法、或者是在操作系統(tǒng)中直接kill(發(fā)送SIGKILL信號(hào))掉JVM進(jìn)程

3.異常關(guān)閉:運(yùn)行中遇到RuntimeException異常、OOM錯(cuò)誤等。

二、ShutdownHook

通常JVM可使用runtime.addShutdownHook()對(duì)退出信號(hào)做處理,它讓我們?cè)诔绦蛘M顺龌蛘甙l(fā)生異常時(shí)能有機(jī)會(huì)做一些清場(chǎng)工作。關(guān)閉鉤子其實(shí)可以看成是一個(gè)已經(jīng)初始化了的但還沒啟動(dòng)的線程,當(dāng)JVM關(guān)閉時(shí)會(huì)并發(fā)無序地執(zhí)行注冊(cè)的所有關(guān)閉鉤子。

Runtime.getRuntime().addShutdownHook(handleThread);    //handleThread是信號(hào)處理線程。

ShutdownHook響應(yīng)的信號(hào)如下:

  • 1(SIGHUP):如果使用了nohup則不響應(yīng);
  • 2(SIGINT):如果使用了后臺(tái)&則不響應(yīng);
  • 15(SIGTERM):都響應(yīng)。

注意事項(xiàng):

  • 不要使用kill -9來結(jié)束進(jìn)程,這樣ShutdownHook得不到執(zhí)行;
  • ShutdownHook要盡量短。計(jì)算機(jī)在關(guān)機(jī)前,會(huì)給所有的進(jìn)程發(fā)送一個(gè)SIGTERM信號(hào),等若干秒后就直接發(fā)送SIGKILL了;
  • ShutdownHook要保證線程安全。如果多次發(fā)送信號(hào),那么ShutdownHook被不同的線程多次執(zhí)行。

三、SignalHandler

用戶可以自定義SignalHander對(duì)特定信號(hào)進(jìn)行處理。

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對(duì)每個(gè)信號(hào)都啟動(dòng)一個(gè)線程進(jìn)行處理。注冊(cè)TERM信號(hào),就啟動(dòng)"SIGTERM handler" 線程。即便主線程被阻塞,信號(hào)依然可以得到處理。由于對(duì)信號(hào)的處理是多線程的,所以應(yīng)保證信號(hào)處理實(shí)例SignalHandler應(yīng)該是線程安全的。

四、總結(jié)

  • ShutdownHook只響應(yīng)1(SIGHUP)、2(SIGINT)、15(SIGTERM)三種信號(hào),而JVM一般用nohup...&的方式啟動(dòng),所以會(huì)忽略1、2兩種信號(hào);
  • ShutdownHook觸發(fā)時(shí),多個(gè)鉤子會(huì)并發(fā)無序執(zhí)行。如果資源關(guān)閉上有先后依賴則會(huì)有問題;

4.1 優(yōu)雅關(guān)閉

由于ShutdownHook的并發(fā)無序執(zhí)行,所以我們?cè)趦?yōu)雅關(guān)閉時(shí)不能直接kill -15,比如有殘留請(qǐng)求的情況,如果部分資源已關(guān)閉,那么殘留請(qǐng)求的執(zhí)行會(huì)有異常。 正確流程如下:

  1. kill -12:等待10s。用戶自定義SignalHandler處理12信號(hào),而且此時(shí)所有的資源都是正常狀態(tài)。1)告知上游該服務(wù)已關(guān)閉,不要再發(fā)請(qǐng)求;2)處理殘留的請(qǐng)求;3)其他需要正常關(guān)閉的操作。
  2. kill -15:等待10s。這時(shí)會(huì)并發(fā)無序執(zhí)行注冊(cè)的ShutdownHook,進(jìn)行一些資源的釋放,很有可能不需要10sJVM就退出了。
  3. kill -9:如果kill -15還沒有終止JVM,則直接強(qiáng)制退出。

這里的優(yōu)雅就體現(xiàn)在第一步的10秒kill -12,在資源都正常的情況下給業(yè)務(wù)一些時(shí)間來正常關(guān)閉服務(wù)。 

 4.2 示例

我們以轉(zhuǎn)轉(zhuǎn)的RPC框架ZZSCF為例,來看其是如何實(shí)現(xiàn)優(yōu)雅關(guān)閉的。

4.2.1 kill -12

首先,我們進(jìn)行kil -12并等待10秒,用戶自定義SignalHandler來處理12信號(hào),而且此時(shí)所有的資源都是正常狀態(tài)。

圖片圖片

圖片圖片

圖片圖片

圖片圖片

圖片圖片

圖片圖片

4.2.2 kill -15

接著,我們進(jìn)行kil -15并等待10秒。這時(shí)會(huì)并發(fā)無序執(zhí)行注冊(cè)的ShutdownHook,進(jìn)行一些資源的釋放,很有可能不需要10sJVM就退出了。

4.2.3 kill -9

最后,如果kill -15還沒有終止JVM,則直接強(qiáng)制退出。

五、啟動(dòng)腳本DEMO

這里附贈(zèng)常用JVM的重啟腳本。                                                                            

用法:./main.sh start|stop|restart|kill|status

查看源碼鏈接:https://github.com/waterystone/shell_test/blob/main/jvm/main.sh

六、參考

  • How to gracefully handle the SIGKILL signal in Java:https://stackoverflow.com/questions/2541597/how-to-gracefully-handle-the-sigkill-signal-in-java
  • 服務(wù)如何優(yōu)雅關(guān)閉:https://juejin.cn/post/6844903814181421064
責(zé)任編輯:武曉燕 來源: 轉(zhuǎn)轉(zhuǎn)技術(shù)
相關(guān)推薦

2021-12-21 09:05:46

命令Linux敲錯(cuò)

2020-04-30 09:19:56

Docker容器虛擬機(jī)

2020-06-15 08:03:17

大文件OOM內(nèi)存

2015-05-29 09:01:48

2021-06-08 07:48:26

數(shù)據(jù) Python開發(fā)

2021-12-06 15:02:37

RabbitMQ系統(tǒng)消息

2020-01-21 21:15:16

WiFi網(wǎng)絡(luò)WiFi6

2018-10-30 16:10:41

Linux救援模式命令

2022-01-27 08:27:23

Dubbo上下線設(shè)計(jì)

2021-04-20 10:20:27

Dubbo網(wǎng)絡(luò)通信通信協(xié)議

2021-08-13 22:38:36

大數(shù)據(jù)互聯(lián)網(wǎng)技術(shù)

2023-06-06 08:11:09

kafka事務(wù)消息語義

2021-09-30 22:46:05

微信安全支付

2020-04-10 09:55:28

Git 工具黑魔法

2015-10-22 10:38:43

Wi-Fi燃?xì)鈭?bào)警器

2021-06-04 12:05:03

Redis Bitmap 數(shù)據(jù)庫

2019-09-04 10:00:07

手機(jī)人臉識(shí)別

2022-09-14 08:02:25

加密算法Bcryp

2021-06-11 07:14:04

QQ音樂微信翻譯
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区精品 | 久久精品国产亚洲 | 国产 欧美 日韩 一区 | 亚洲精品字幕 | 亚洲欧洲小视频 | 激情五月婷婷 | 久久精品国产99国产 | 日韩一区二区在线视频 | 欧美一级视频免费看 | 精品综合久久久 | 成年人免费网站 | 水蜜桃久久夜色精品一区 | 国产成人一区二 | 久在线精品视频 | 日韩一二区在线 | 中文字幕一区二区三区不卡 | 午夜激情一区 | 精品网站999 | 在线日韩视频 | 北条麻妃一区二区三区在线观看 | 一级aaaaaa毛片免费同男同女 | 中文一区| 欧美亚洲国产精品 | 成人亚洲 | 99精品欧美一区二区三区综合在线 | 成人精品| 国产在线拍偷自揄拍视频 | 亚洲第一视频网站 | 久久久久综合 | 亚洲精品视频免费观看 | 精品一区av| 一区二区福利视频 | 综合色播 | 中文日本在线 | 一区二区三区中文字幕 | 国产伦精品一区二区三区精品视频 | 美女一级a毛片免费观看97 | 中文字幕日韩一区 | 91国内精品 | 精品国产乱码久久久久久88av | 久久国产视频网 |