日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JVM應(yīng)用優(yōu)雅上下線,再也不擔(dān)心抖動了

一、前言

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

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的平南網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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

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

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

二、ShutdownHook

通常JVM可使用runtime.addShutdownHook()對退出信號做處理,它讓我們在程序正常退出或者發(fā)生異常時能有機(jī)會做一些清場工作。關(guān)閉鉤子其實(shí)可以看成是一個已經(jīng)初始化了的但還沒啟動的線程,當(dāng)JVM關(guān)閉時會并發(fā)無序地執(zhí)行注冊的所有關(guān)閉鉤子。

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

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

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

注意事項(xiàng):

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

三、SignalHandler

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

四、總結(jié)

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

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

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

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

這里的優(yōu)雅就體現(xiàn)在第一步的10秒kill -12,在資源都正常的情況下給業(yè)務(wù)一些時間來正常關(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信號,而且此時所有的資源都是正常狀態(tài)。

圖片

圖片

圖片

圖片

圖片

圖片

4.2.2 kill -15

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

4.2.3 kill -9

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

五、啟動腳本DEMO

這里附贈常用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

本文名稱:JVM應(yīng)用優(yōu)雅上下線,再也不擔(dān)心抖動了
本文網(wǎng)址:http://www.5511xx.com/article/dhggogg.html