JVM 內部的 Java 類和對象的結構與訪問機制分析

一、OOP-Klass 對象系統:JVM 內部的 Java 類與對象實現

  • JVM是基於 C++ 實現的,故 Java 的每個類被 JVM 加載之後,需要使用一個 C++ 的對等體來維護,同時Java對象實例也需要在C++中能夠被訪問,JVM的實現機制為OOP-Klass,其中 OOP 是針對一個Java 對象實例而言的,而 Klass 則是針對一個 Java 類而言的,具體為:
  1. OOP: Java 對象指針,用來指向 Java 對象實例;
  2. Klass:Java 類的 C++ 對等體,用來描述 Java 類的信息。

二、Java 對象的內存結構

  • 每個 Java 對象包含對象頭和實例數據兩部分,內存結構為連續內存,具體如圖:(圖片均引自《 Hotspot 實戰》)
JVM 內部的 Java 類和對象的結構與訪問機制分析

  • 實例數據就是 Java 對象的成員屬性的數據,而對象頭由 Mark Word 和元數據指針兩部分組成:

(1)Mark Word:記錄對象的運行時狀態信息(哈希碼,GC分代年齡,鎖狀態標誌,線程持有的鎖,偏向線程ID,偏向時間戳等),如下:

JVM 內部的 Java 類和對象的結構與訪問機制分析

(2)元數據指針:指向該 Java 對象實例所屬的 Java 類對應的 Klass 對象 instanceKlass,其中 Klass 對象 instanceKlass 存儲了該對象實例所屬 Java 類的元數據信息,instanceKlass 對象存放在方法區中。虛擬機在運行過程中通過該 klass 對象指針去方法區獲取該包含 Java 類元數據信息的 instanceKlass 對象。

三、Java 對象引用 OOP,Java 對象與 Java 類的關係:JVM 內存分佈與 JVM對象訪問機制

  • Java 對象引用 OOP 位於棧中,Java 對象實例(包含對象頭和實例數據,其中實例數據為對象實例的字段數據)位於堆中,Java 對象所屬 Java 類的類對象 instanceKlass(包含對象方法和類變量等信息)位於方法區中。
  • 這三者的訪問機制如圖:

(1)Java 對象引用位於棧中,包含指向堆中的 Java 對象實例的指針,從而可以訪問 Java 對象實例。

(2)Java 對象實例由對象頭和實例數據兩部分組成,其中對象頭中包含元數據指針,通過元數據指針訪問方法區的 Java 類元數據對象 instanceKlass。

JVM 內部的 Java 類和對象的結構與訪問機制分析


分享到:


相關文章: