目錄
1.JVM整體結構
2.Java代碼執行流程
3.JVM的生命周期
3.1 虛拟機的啟動
3.2 虛拟機的執行
3.3 虛拟機的退出
JVM是Java Virtual Machine的縮寫,是一種用于計算裝置的規範,是一個虛構出來的計算機,通過在實際的計算機上仿真模拟各種計算機功能來實作的。引入Java語言虛拟機後,Java語言在不同平台上運作時不需要重新編譯。Java語言使用Java虛拟機屏蔽了與具體平台相關的資訊,使得Java語言編譯程式隻需生成在Java虛拟機上運作的目标代碼(位元組碼),就可以在多種平台上不加修改地運作。JVM整體結構如圖(圖檔來源于網絡):
類加載器:類加載子系統負責從檔案系統或者網絡中加載Class資訊,加載的類資訊存放于一塊稱為方法區的記憶體空間。除了類的資訊外,方法區中可能還會存放運作時常量池資訊,包括字元串字面量和數字常量(這部分常量資訊是Class檔案中常量池部分的記憶體映射)。
方法區:是用來存放有關類、方法資訊的一塊邏輯上的區域
堆:java堆在虛拟機啟動的時候建立,它是java程式最主要的記憶體工作區域。幾乎所有的java對象執行個體都存放在java堆中。堆空間是所有線程共享的,是一塊與java應用密切相關的記憶體空間。
棧:每一個java虛拟機線程都有一個私有的java棧,一個線程的java棧線上程建立的時候被建立,java棧中儲存着幀資訊,java棧中儲存着局部變量、方法參數,同時和java方法的調用、傳回密切相關。
本地方法棧:本地方法棧和java棧非常類似,最大的不同在于java棧用于方法的調用,而本地方法棧則用于本地方法的調用,作為對java虛拟機的重要擴充,java虛拟機允許java直接調用本地方法。
程式計數器:又稱PC(Program Counter)寄存器,是每一個線程私有的空間,java虛拟機會為每一個java線程建立程式計數器。在任意時刻,一個java線程總是在執行一個方法,這個正在被執行的方法稱為目前方法。如果目前方法不是本地方法,PC寄存器就會指向目前正在被執行的指令。如果目前方法是本地方法,那麼PC寄存器的值就是undefined。
執行引擎:執行引擎是java虛拟機的最核心元件之一,它負責執行虛拟機的位元組碼,現代虛拟機為了提高執行效率,會使用即時編譯技術将方法編譯成機器碼後再執行。
Java代碼編譯是由Java源碼編譯器來完成,流程圖如下所示:
Java位元組碼(class檔案)的執行是由JVM執行引擎來完成,流程圖如下所示:
JVM完整結構圖:
Java虛拟機的啟動是通過引導類加載器(bootstrap class loader)建立一個初始類(initial class)來完成的。
(1)一個運作中的Java虛拟機有着一個清晰的任務:執行Java程式
(2)程式開始執行時虛拟機才運作,程式結束時停止
(3)執行Java程式的時,真真正正在執行的是一個叫做Java虛拟機的程序
虛拟機退出有如下的幾種情況:
(1)程式正常執行結束
(2)程式在執行過程中遇到了異常或錯誤而異常終止
(3)由于作業系統用現錯誤而導緻Java虛拟機程序終止
(4)某線程調用Runtime類或System類的exit()方法,或Runtime類的halt()方法,并且Java安全管理器也允許這次exit()或halt()操作。
(5)除此之外,JNI(Java Native Interface)規範描述了用JNI Invocation API來加載或解除安裝 Java虛拟機時,Java虛拟機的退出情況。