一、HotSpot內核模塊組成和功能框架
1、HotSpot內核模塊圖
(1)Prims模塊:
(2)Service模塊:
(3)Runtime模塊:
二、虛擬機生命周期(JVM初始化過程)
1、虛擬機生命周期時序圖
1:Lancher JVM啟動器
Lancher是用於啟動JVM和應用程序的工具,HotSpot中提供兩種Lancher類型:通用啟動器(即JDK命令程序:java,為產品級啟動器)、調試版啟動器gamma
通用啟動器:入口在hotspot/../jdk/src/share/bin/main.c
調試版啟動器:入口在/hotspot/src/share/tools/lancher/java.c
Lancher入口main函數:不同操作系統中main函數的原型存在差異
Linux或Unix系統中:在/hotspot/src/share/tools/lancher/java.c
Windows系統中:../jdk/src/share/bin/main.c
main工作重點:創建一個運行環境,啟動一個新的線程創建JVM,並調用Java程序的main方法
新線程(主線程)執行入口:JavaMain方法 ,伴隨應用程序的整個生命周期
2:主線程(JavaMain線程)
JavaMain方法在:/hotspot/src/share/tools/lancher/java.c
JavaMain的主要流程:
初始化JVM,完成對vm和env指派接口函數的重任
4:JNI_CreateJavaVM函數:
主要任務是調用Threads模塊的create_vm()函數,以完成最終的虛擬機的創建和初始化工作。
在Threads模塊中,實現對虛擬機各個模塊的初始化,以及創建虛擬機線程.
5:create_vm()初始化JVM系統相關模塊
6:add()函數,將線程加入線程隊列
7:create()函數,創建虛擬機線程”VMThread”
VMThread是在JVM內部執行VMOperation的線程,實現JVM內部的核心操作,為其他運行時模塊以及外部程序接口服務。VMThread線程創建成功后,在整個運行期間不斷等待/接受並執行制定的VMOperation
創建守護線程,包括:Signal Dispatcher,Attach Listener,Watcher Thread等
8:vm_init_globals():
實現對全局性數據結構的初始化,比如初始化Java基本類型系統、分配全局事件緩存區、初始化事件隊列、初始化全局鎖、初始化內存池、初始化JVM性能統計數據區(Perf Data)
9:init_globals()函數,初始化全局模塊
全局模塊有:JMX(Manage模塊),Code Cache(代碼高速緩存),StubRountines,Universe,解釋器,模板表,stubs
10:LoadClass()函數:加載應用程序主類
11:jni_CallStaticVoidMethod()函數,實現對Java應用程序的主方法的調用。
12:jni_DetachCurrentThread()函數
13:jni_DestroyJavaVM()函數,銷毀JVM后退出