RunTime.getRunTime().addShutdownHook

看源碼看到, Runtime.getRuntime().addShutdownHook(shutdownHook);併發

google了一下它的含義:在jvm中增長一個關閉的鉤子,當jvm關閉的時候,會執行系統中已經設置的全部經過方法addShutdownHook添加的鉤子,當系統執行完這些鉤子後,jvm纔會關閉。因此這些鉤子能夠在jvm關閉的時候進行內存清理、對象銷燬等操做。jvm


  

在瞭解關閉鉤子以前,首先介紹一下Runtime. google

  經過Runtime實例,使得應用程序和其運行環境相鏈接。Runtime是在應用啓動期間自動創建,應用程序不可以建立Runtime,可是咱們能夠經過Runtime.getRuntime()來得到當前應用的Runtime對象引用,經過該引用咱們能夠得到當前運行環境的相關信息,好比空閒內存、最大內存以及爲當前虛擬機添加關閉鉤子(addShutdownHook()),執行指定命令(exec())等等。spa


 

那麼,什麼叫作jvm關閉呢。繼續google,總結一下以下:操作系統

jvm的關閉方式有三種:.net

  1. 正常關閉:當最後一個非守護線程結束或者調用了System.exit或者經過其餘特定平臺的方法關閉(發送SIGINT,SIGTERM信號等)
  2. 強制關閉:經過調用Runtime.halt方法或者是在操做系統中直接kill(發送SIGKILL信號)掉JVM進程
  3. 異常關閉:運行中遇到RuntimeException異常等。

 

關閉鉤子(shutdown hooks)線程

  在某些狀況下,咱們須要在JVM關閉時作些掃尾的工做,好比刪除臨時文件、中止日誌服務以及內存數據寫到磁盤等,爲此JVM提供了關閉鉤子(shutdown hooks)來作這些事情。另外特別注意的是:若是JVM因異常關閉,那麼子線程(Hook本質上也是子線程)將不會中止。但在JVM被強行關閉時,這些線程都會被強行結束。日誌

  關閉鉤子本質是一個線程(也稱爲Hook線程),用來監聽jvm的關閉。經過Runtime的addShutdownHook能夠向JVM註冊一個關閉鉤子。Hook線程在JVM正常關閉纔會執行,強制關閉時不會執行。code

  JVM中註冊的多個關閉鉤子是併發執行的,沒法保證執行順序,當全部Hook線程執行完畢,runFinalizersOnExit爲true,JVM會先運行終結器,而後中止。對象

  注意事項:1.hook線程會延遲JVM的關閉時間,因此儘量減小執行時間。

       2.關閉鉤子中不要調用system.exit(),會卡主JVM的關閉過程。可是能夠調用Runtime.halt()

         3.不能再鉤子中進行鉤子的添加和刪除,會拋IllegalStateException

       4.在system.exit()後添加的鉤子無效,由於此時jvm已經關閉了。

                    5.當JVM收到SIGTERM命令(好比操做系統在關閉時)後,若是鉤子線程在必定時間沒有完成,那麼Hook線程可能在執行過程當中被終止。 

       6.Hook線程也會拋錯,若未捕獲,則鉤子的執行序列會被中止。


參考資料:深刻JVM關閉魚關閉鉤子      

本站公眾號
   歡迎關注本站公眾號,獲取更多信息