剖析hotspot的launcher

Launcher是一種用於啓動JVM進程的啓動器,是一個封裝了虛擬機的執行外殼,他負責裝載JRE環境和Windows平臺下的jvm.dll動態鏈接庫(linux平臺下則是libjvm.so。(並不是虛擬機的實現)在一個JVM的進程內部,只能執行一個指定的Java程序,也就是當執行 多個java程序時,就啓動了多個JVM進程。Launcher是JVM的啓動器 ,那麼必然會由他負責調用HotSpot的核心代碼對JVM執行初始化,以及由他負責維護JVM的整個生命週期。具體流程如下所示:

  1. 進入Launcher的啓動函數main()。(main函數主要負責創建運行環境,以及啓動一個全新的線程去執行JVM的初始化和調用java程序的main方法)
  2. 啓動一個全新的線程調用JavaMain()函數(負責調用InitializeJVM()函數,但InitializeJVM()函數本身並不具備初始化JVM的能力,而是由他調用本地函數JNI_InitializeJVM()函數去完成真正意義上的JVM初始化)。
  3. JVM初始化完成後,Launcher調用LoadClass()函數和GetStaticMethodId()函數,分別獲取Java程序的啓動類和啓動方法。
  4. Launcher會調用本地函數jni_CallStaticVoidMethod()執行java程序的main()方法。
  5. 最後Launcher調用本地函數jni_DetachCurrentThread()斷開與主線程的連接。(斷開與主線程的連接之後,Launcher會一直等待程序中所有的非守護線程(non_daemonthread)全部執行結束)
  6. 調用本地函數jni_DestoryJavaVM()對JVM執行銷燬。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章