欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解讀JVM的生命周期是怎么樣的

 更新時間:2025年03月10日 09:01:00   作者:冰糖心書房  
JVM的生命周期包括啟動、運行和終止三個階段,啟動階段包括創(chuàng)建JVM實例、加載和初始化核心類庫、加載main方法所在的類和初始化類,運行階段包括執(zhí)行main方法、類加載、字節(jié)碼執(zhí)行、內存管理、線程管理和異常處理,終止階段包括正常終止、異常終止和外部終止

JVM的生命周期是怎么樣的

JVM 的生命周期是指 JVM 實例從啟動到終止的整個過程。

一個 Java 應用程序通常對應一個 JVM 實例(除非使用 JNI 等技術在同一進程中創(chuàng)建多個 JVM 實例,但這并不常見)。

JVM 的生命周期階段

啟動 (Startup)

  • 創(chuàng)建 JVM 實例: 當你使用 java 命令運行 Java 程序時,操作系統(tǒng)會創(chuàng)建一個新的進程,并在該進程中啟動一個 JVM 實例。
  • 加載和初始化:
    • 查找并加載 JDK: 找到 JRE (Java Runtime Environment) 的位置.
    • 創(chuàng)建引導類加載器 (Bootstrap Class Loader): 加載核心類庫(rt.jar 等)。
    • 創(chuàng)建擴展類加載器 (Extension Class Loader) 和應用程序類加載器 (Application Class Loader): 分別加載擴展類庫和應用程序的類。
    • 加載 main 方法所在的類: 使用應用程序類加載器加載包含 main 方法的類。
    • 初始化類: 執(zhí)行類的靜態(tài)初始化塊和靜態(tài)變量賦值。
  • 命令行參數(shù): 解析傳入java命令的參數(shù).

運行 (Execution)

  • 執(zhí)行 main 方法: JVM 調用 main 方法,開始執(zhí)行 Java 程序。
  • 類加載: 在程序運行過程中,根據(jù)需要動態(tài)加載類。
  • 字節(jié)碼執(zhí)行: JVM 的執(zhí)行引擎解釋或編譯執(zhí)行字節(jié)碼。
  • 內存管理: JVM 分配和管理內存,進行垃圾回收。
  • 線程管理: JVM 創(chuàng)建和管理線程。
  • 異常處理: JVM 處理程序中發(fā)生的異常。

終止 (Termination)

正常終止:

  • 當程序執(zhí)行完 main 方法,并且所有非守護線程(non-daemon threads)都已結束時,JVM 正常終止。
  • 可以通過調用 System.exit(status) 方法顯式終止 JVM。status 是退出狀態(tài)碼(0 表示正常退出,非 0 表示異常退出)。

異常終止:

  • 如果程序中發(fā)生了未捕獲的異常,并且沒有設置默認的未捕獲異常處理器,JVM 會異常終止。
  • 可以通過 Thread.setDefaultUncaughtExceptionHandler() 設置默認的未捕獲異常處理器。

外部終止:

  • 用戶可以通過操作系統(tǒng)命令(例如,在 Linux 中使用 kill 命令)強制終止 JVM 進程。
  • JVM 可能會收到操作系統(tǒng)發(fā)送的終止信號(例如,SIGTERM)。

鉤子 (Shutdown Hooks):

  • 在 JVM 終止之前,可以注冊一些鉤子函數(shù)(shutdown hooks),用于執(zhí)行一些清理操作(例如,關閉數(shù)據(jù)庫連接、釋放資源等)。
  • 可以使用 Runtime.getRuntime().addShutdownHook(Thread hook) 方法注冊鉤子函數(shù)。
  • 鉤子函數(shù)會在以下情況下執(zhí)行:
    • 程序正常退出。
    • 調用 System.exit()。
    • 用戶中斷程序(例如,按下 Ctrl+C)。
    • 系統(tǒng)關閉。
  • 鉤子函數(shù)執(zhí)行的順序是不確定的。

總結流程圖

+----------------+
|    啟動 JVM     |  (java 命令)
+----------------+
        |
        V
+----------------+
|  加載和初始化    |
|  - 查找并加載 JDK |
|  - 創(chuàng)建類加載器   |
|  - 加載 main 類   |
|  - 初始化類      |
+----------------+
        |
        V
+----------------+
|    運行程序     |
|  - 執(zhí)行 main 方法|
|  - 類加載       |
|  - 字節(jié)碼執(zhí)行    |
|  - 內存管理     |
|  - 線程管理     |
|  - 異常處理     |
+----------------+
        |
        V
+----------------+
|    終止 JVM     |
|  - 正常終止      |
|  - 異常終止      |
|  - 外部終止      |
|  - 執(zhí)行鉤子函數(shù)   |
+----------------+

代碼示例 (演示鉤子函數(shù))

public class JVMLifecycle {

    public static void main(String[] args) {

        // 注冊鉤子函數(shù)
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("JVM 即將終止,執(zhí)行清理操作...");
            // 在這里執(zhí)行清理操作 (例如,關閉數(shù)據(jù)庫連接、釋放資源等)
        }));

        System.out.println("程序開始執(zhí)行...");

        // 模擬程序運行一段時間
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("程序執(zhí)行完畢...");

        // 可以選擇顯式退出 (也可以不調用 exit,讓程序自然結束)
        // System.exit(0);
    }
}

運行結果:

程序開始執(zhí)行...
程序執(zhí)行完畢...
JVM 即將終止,執(zhí)行清理操作...

注意:

  • 如果程序中存在死循環(huán)或無限等待,JVM 可能永遠不會終止。
  • 守護線程 (daemon thread) 不會阻止 JVM 終止。當所有非守護線程都結束后,JVM 會強制終止所有守護線程。
  • 鉤子函數(shù)應該盡量簡短,避免執(zhí)行耗時的操作,否則可能會導致 JVM 無法正常終止。
  • 不要在鉤子函數(shù)中調用 System.exit(),否則會導致死循環(huán)。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • WebDriver中實現(xiàn)對特定的Web區(qū)域截圖方法

    WebDriver中實現(xiàn)對特定的Web區(qū)域截圖方法

    這篇文章主要介紹了WebDriver中實現(xiàn)對特定的Web區(qū)域截圖方法,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • Java之InputStreamReader類的實現(xiàn)

    Java之InputStreamReader類的實現(xiàn)

    這篇文章主要介紹了Java之InputStreamReader類的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 詳解Spring boot Admin 使用eureka監(jiān)控服務

    詳解Spring boot Admin 使用eureka監(jiān)控服務

    本篇文章主要介紹了詳解Spring boot Admin 使用eureka監(jiān)控服務,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Spring定時任務注解@Scheduled詳解

    Spring定時任務注解@Scheduled詳解

    這篇文章主要介紹了Spring定時任務注解@Scheduled詳解,@Scheduled注解是包org.springframework.scheduling.annotation中的一個注解,主要是用來開啟定時任務,本文提供了部分實現(xiàn)代碼與思路,需要的朋友可以參考下
    2023-09-09
  • Java創(chuàng)建內部類對象實例詳解

    Java創(chuàng)建內部類對象實例詳解

    這篇文章主要介紹了Java創(chuàng)建內部類對象實例詳解的相關資料,需要的朋友可以參考下
    2017-05-05
  • 解決idea web 配置相對路徑問題

    解決idea web 配置相對路徑問題

    這篇文章主要介紹了idea web 配置相對路徑問題的解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06
  • Java實現(xiàn)UTF-8編碼與解碼方式

    Java實現(xiàn)UTF-8編碼與解碼方式

    這篇文章主要介紹了Java實現(xiàn)UTF-8編碼與解碼方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java實現(xiàn)學生管理系統(tǒng)(面向對象)

    java實現(xiàn)學生管理系統(tǒng)(面向對象)

    這篇文章主要為大家詳細介紹了java實現(xiàn)學生管理系統(tǒng)(面向對象),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Feign調用可重試的最佳方案分享

    Feign調用可重試的最佳方案分享

    通過spring-retry框架集合Feign去實現(xiàn)重試機制,可以為每個調用實現(xiàn)不同的重試機制,那這究竟是如何做到的呢,本文將為大家詳細講講
    2023-01-01
  • Java多線程實現(xiàn)方塊賽跑小游戲

    Java多線程實現(xiàn)方塊賽跑小游戲

    這篇文章主要為大家詳細介紹了Java多線程實現(xiàn)方塊賽跑小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評論