Java虛擬機之體系結構

       Java虛擬機是運行java程序的載體。每一個java程序,都會啓動一個單獨的Java虛擬機。虛擬機之間有自己獨立的空間,相互之間不會干擾。那麼,java程序的class文件是如何在虛擬機上運行的呢?我們先了解一下Java虛擬機的體系結構,以及其工作原理。

Java虛擬機的體系結構圖

1.類裝載器

       負責查找並裝載類型。Java虛擬機提供兩種類裝載器:Java虛擬機中的啓動類裝載器;java程序中的自定義類裝載器。自定義類裝載器必須繼承java.lang.ClassLoader,是普通的java對象。每個被裝載的類,不管是被啓動類裝載器裝載,還是被自定義類裝載器裝載,Java虛擬機都會創建一個java.lang.Class類的實例來表示該類。自定義類裝載器和Class類的實例都存儲在堆區,而類的信息存儲在方法區。

     類裝載器裝載類的流程:

    裝載:查找並裝載類的class文件

    連接:驗證類的正確性;爲類變量分配內存,並初始化爲默認值;符號引用轉換爲直接引用

    初始化:把類變量初始化爲正確初始值。

2.方法區

       存儲從class文件中裝載的類的基本信息,是類在內存中的一種狀態。如何將類從class文件中的狀態映射到內存的方法區中狀態,涉及到Java虛擬機中非常重要的一部分,那就是連接模型。這部分比較複雜,以後再單獨介紹。

      方法區中類的信息主要包括:

      類的全限定名:類Object的全限定名爲java.lang.Object

      類的直接父類的全限定名

     該類是類類型還是接口類型

     類的修飾符

     類直接實現的接口的全限定名列表

     類的常量池:所有常量有序集合,包括直接常量和符號引用,都是通過索引訪問

     字段信息和方法信息

     類的靜態變量:只與類有關,與實例無關,在方法區爲其分配存儲空間

 3. 堆

       存儲運行時所創建的類的對象實例和數組。在java中,數組也是對象,也有對應的Class實例。不管數組的長度是多少,所有相同維度和類型的數組共用同一個Class實例。垃圾回收主要對該部件進行操作。

4. 棧

       每個線程都有自己獨立的java棧,用棧幀的形式來保存線程的執行狀態。線程每調用一個方法,就會在該線程的java棧中壓入一個棧幀,存儲該方法的參數、局部變量、中間運算結果等數據。

5.執行引擎

       Java虛擬機的實現核心,定義指令集。每個線程都是一個獨立的執行引擎實例,它要麼執行字節碼指令,要麼執行本地方法。

6.本地方法接口

       爲Java程序調用本地方法提供的接口,爲了可移植性和發揮主機平臺的功能。Sun的本地方法接口是JNI(Java Native Interface)。

 

        以上部件在每個Java虛擬機中,只有一個,所有線程都會共享它們。因此,必須考慮多線程在同時訪問它們的同步問題。




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