當前位置:編程學習大全網 - 編程軟體 - JVM對象頭(header)

JVM對象頭(header)

HotSpot 虛擬機的對象頭包括兩部分信息:Mark Word(標記字段)和 Klass Pointer(類型指針)

? 1. Mark Word 用於存儲對象自身的運行時數據,如哈希碼(HashCode)、GC分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程 ID、偏向時間戳等等。JVM 對象頭壹般占用兩個機器碼,在 32-bit JVM 上占用 64bit, 在 64-bit JVM 上占用 128bit 即 16 bytes(暫不考慮開啟壓縮指針的場景)。

另外,如果對象是壹個 Java 數組,那在對象頭中還必須有壹塊用於記錄數組長度的數據,因為虛擬機可以通過普通 Java 對象的元數據信息確定 Java 對象的大小,但是從數組的元數據中無法確定數組的大小。

對象需要存儲的運行時數據很多,其實已經超出了32、64位 Bitmap 結構所能記錄的限度,但是對象頭信息是與對象自身定義的數據無關的額外存儲成本,考慮到虛擬機的空間效率,Mark Word 被設計成壹個非固定的數據結構以便在極小的空間內存儲盡量多的信息,它會根據對象的狀態復用自己的存儲空間。

例如在 32 位的HotSpot 虛擬機中對象未被鎖定的狀態下,Mark Word 的 32個Bits 空間中的 25Bits 用於存儲對象哈希碼(HashCode),4Bits 用於存儲對象分代年齡,2Bits 用於存儲鎖標誌位,1Bit固定為0,在其他狀態(輕量級鎖定、重量級鎖定、GC標記、可偏向)下對象的存儲內容如下表所示。

  • 上一篇:如何制作手機版html5如何制作手機版PPT
  • 下一篇:常熟優方模具科技有限公司怎麽樣?
  • copyright 2024編程學習大全網