java虛擬機器是什麼
“java虛擬機器”可能指以下三種東西:
1)、抽象規範;
2)、一個具體的實現;
3)、一個運行中的虛擬機器執行個體;
java虛擬機器生命週期
啟動
當啟動一個java程式時,一個虛擬機器執行個體誕生。
虛擬機器執行個體通過調用某個初始類的public static void main(String[] args)方法來運行一個java程式。
任何擁有這樣一個main方法的類都可以作為java程式啟動並執行起點,所以必須要告訴虛擬機器初始類的名稱,整個程式將從它的main方法開始運行。
消亡
初始類的main方法作為程式初始線程的起點,任何其他線程都是由初始線程啟動。
java虛擬機器內部有兩種線程:守護線程和非守護線程。
守護線程,通常是虛擬機器使用的線程,如執行垃圾收集。java程式也可以把建立的線程標記為守護線程。
非守護線程,java中的初始線程,就是開始於main方法的線程是非守護線程。
只要程式中有非守護線程在運行,那麼java程式也在繼續運行(虛擬機器仍然存活),當程式中所有的非守護線程都終止時,虛擬機器執行個體自動結束。
程式本身也可以通過Runtime類或System類的exit()方法退出。
java虛擬機器體繫結構
![]()
類裝載子系統
1)、負責尋找並裝載類型,分成裝載、串連和初始化,在java類型生命週期中有詳細說明;
2)、有兩種類裝載器:啟動類裝載器和使用者自訂類裝載器;
使用者自訂類裝載器必須派生自java.lang.ClassLoader類。
運行時資料區
方法區
被裝載類型的資訊儲存在方法區中,詳細如下:
基本資料
1)、類型的全限定名;
2)、類型的直接超類的全限定名;
3)、類型是類類型還是介面類型;
4)、類型的存取修飾詞;
5)、直接超介面的全限定名;
其他資訊
1)、類型的常量池;
2)、欄位資訊;
3)、方法資訊;
4)、除了常量以為的所有靜態變數;
5)、一個到ClassLoader類的引用;
6)、一個到Class類的引用;
堆
1)、運行時建立的所有類執行個體和數組都放在堆中;
2)、一個java虛擬機器執行個體只存在一個堆空間,因此虛擬機器中的所有線程都共用這個堆;
3)、一個java程式獨佔一個java虛擬機器執行個體,因此每個java程式都有他自己的堆空間;
java棧
1)、每啟動一個新線程時,java虛擬機器都會為他分配一個java棧;
2)、java棧以幀為單位儲存線程的運行狀態;
3)、java虛擬機器對java棧只執行兩種操作:壓棧和出棧;
4)、壓棧:每當線程調用一個java方法時,虛擬機器都會在該線程的java棧中壓入一個新幀。使用這個幀來儲存參數、局部變數、中間運算結果等;
5)、出棧:當java方法通過return正常返回,或通過拋出異常中止,虛擬機器都會將當前幀彈出java棧然後釋放掉;
6)、棧資料是線程私人的,所以不需要考慮多線程情況下棧資料的訪問同步問題;
棧幀
1)、棧幀由三部分組成:局部變數區、運算元區和棧資料區;
PC寄存器
1)、對於運行中的java程式,每個線程都有自己的pc寄存器;
2)、線程啟動時建立;
3)、當線程執行某個java方法時,PC寄存器的內容總是下一條將被執行指令的地址。
本地方法棧
1)、任何本地方法介面都會使用本地方法棧;
執行引擎
1)、執行引擎是java虛擬機器實現的核心;
2)、“執行引擎”可以有三種理解:
a)、一個是抽象的規範;
b)、一個是具體的實現;
c)、一個是正在啟動並執行執行個體;
3)、執行引擎的行為使用指令集來定義。對於每條指令,規範都規定了執行該指令時應該處理什麼,如果處理不做規定;
待細化。。。