深入理解Java虛擬機的體系結構

JAVA虛擬機的生命週期

一個運行時的Java虛擬機實例的天職是:負責運行一個java程序。當啓動一個Java程序時,一個虛擬機實例也就誕生了。當該程序關閉退出,這個虛擬機實例也就隨之消亡。如果同一臺計算機上同時運行三個Java程序,將得到三個Java虛擬機實例。每個Java程序都運行於它自己的Java虛擬機實例中。

Java虛擬機實例通過調用某個初始類的main()方法來運行一個Java程序。而這個main()方法必須是共有的(public)、靜態的(static)、返回值爲void,並且接受一個字符串數組作爲參數。任何擁有這樣一個main()方法的類都可以作爲Java程序運行的起點。

深入理解Java虛擬機的體系結構

 

在上面的例子中,Java程序初始類中的main()方法,將作爲該程序初始線程的起點,任何其他的線程都是由這個初始線程啓動的。

在Java虛擬機內部有兩種線程:守護線程和非守護線程。守護線程通常是由虛擬機自己使用的,比如執行垃圾收集任務的線程。但是,Java程序也可以把它創建的任何線程標記爲守護線程。而Java程序中的初始線程——就是開始於main()的那個,是非守護線程。

只要還有任何非守護線程在運行,那麼這個Java程序也在繼續運行。當該程序中所有的非守護線程都終止時,虛擬機實例將自動退出。假若安全管理器允許,程序本身也能夠通過調用Runtime類或者System類的exit()方法來退出。

Java虛擬機的體系結構

下圖是JAVA虛擬機的結構圖,每個Java虛擬機都有一個類裝載子系統,它根據給定的全限定名來裝入類型(類或接口)。同樣,每個Java虛擬機都有一個執行引擎,它負責執行那些包含在被裝載類的方法中的指令。

深入理解Java虛擬機的體系結構

 

當JAVA虛擬機運行一個程序時,它需要內存來存儲許多東西,例如:字節碼、從已裝載的class文件中得到的其他信息、程序創建的對象、傳遞給方法的參數,返回值、局部變量等等。Java虛擬機把這些東西都組織到幾個“運行時數據區”中,以便於管理。

某些運行時數據區是由程序中所有線程共享的,還有一些則只能由一個線程擁有。每個Java虛擬機實例都有一個方法區以及一個堆,它們是由該虛擬機實例中所有的線程共享的。當虛擬機裝載一個class文件時,它會從這個class文件包含的二進制數據中解析類型信息。然後把這些類型信息放到方法區中。當程序運行時,虛擬機會把所有該程序在運行時創建的對象都放到堆中。

深入理解Java虛擬機的體系結構

 

當每一個新線程被創建時,它都將得到它自己的PC寄存器(程序計數器)以及一個Java棧,如果線程正在執行的是一個Java方法(非本地方法),那麼PC寄存器的值將總是指向下一條將被執行的指令,而它的Java棧則總是存儲該線程中Java方法調用的狀態——包括它的局部變量,被調用時傳進來的參數、返回值,以及運算的中間結果等等。而本地方法調用的狀態,則是以某種依賴於具體實現的方法存儲在本地方法棧中,也可能是在寄存器或者其他某些與特定實現相關的內存區中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章