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)、執行引擎的行為使用指令集來定義。對於每條指令,規范都規定了執行該指令時應該處理什麼,如果處理不做規定;
待細化。。。