JAVA虛擬機

1.Java虛擬機的生命週期

    每個Java程序都運行於某個具體的Java虛擬機實現的實例上。當啓動一個Java程序時,一個虛擬機實例就誕生了。當該程序關閉時,虛擬機實例也隨之消亡。如果在同一臺計算機上同時運行三個Java程序,將得到三個Java虛擬機實例。

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

        public static void main(String[] args) {}
    Java程序初始類中的main()方法,將作爲該程序初始線程的起點,任何其他的線程都是由這個初始線程啓動的。JVM內部有兩種線程:守護線程和非守護線程(用戶線程)。守護線程通常由JVM自己使用,如執行垃圾收集任務的線程;也可以將創建的線程標記爲守護線程(調用setDeamon()方法創建一個守護線程,守護線程創建的線程默認爲守護線程),它從屬於創建它的線程,當主線程結束時,守護線程也隨之消亡。不是守護線程的線程稱爲用戶線程。用戶線程有自己的生命週期,不依賴於創建它的線程。只要還有任何非守護線程在運行,那麼這個Java程序也在運行,當然JVM也仍然存活。

2.JVM的內部體系結構

    Java虛擬機的內部體系結構如下圖所示:


    每個Java虛擬機都有一個類裝載器子系統,它根據給定的全限定名來裝入類型;同樣,每個虛擬機都有一個執行引擎,它負責執行那些包含在被裝載類的方法中的指令。“運行時數據區”用於保存類型信息,字節碼,對象,參數,局部變量,中間變量等運行時數據。JVM實例都包含一個方法區和堆區,它們被所有的線程共享,方法區用於保存所有被裝載類的class文件中的類型信息,Java程序運行過程中創建的對象存儲到堆區中。每當一個新線程被創建時,它都有屬於自己的PC寄存器和一個Java棧(私有的,其他線程無法訪問)。Java棧總是保存該線程中正在執行的Java方法(非本地方法)的狀態,包括局部變量,參數,返回值以及中間結果。而本地方法的調用的狀態則存儲在本地方法棧中。Java棧由許多棧幀組成,一個棧幀包含一個Java方法調用的狀態。當線程調用一個Java方法時,JVM壓入一個棧幀到該線程對應的Java棧中,當該方法返回時,這個棧幀被被從Java棧中彈出並拋棄。
發佈了20 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章