對象的內存佈局 (HotSpot)小結

對象的內存佈局 (HotSpot)小結

總共分爲三個部分,對象頭、實例數據和對齊填充部分

對象頭

主要用於從存儲兩部分信息:對象自身的運行時數據和類型指針

  • 存儲對象自身的運行時數據
    • 內容舉例:
      • 哈希碼HashCode
      • GC分代年齡
      • 鎖狀態標識
      • 線程持有的鎖等
    • 長度(未開啓壓縮指針下):32 or 64 位的虛擬機中分別爲 32bit or 64 bit
    • 官方名稱:Mark Word
    • 非固定數據結構:
      • 考慮到存儲效率,已讓其在及小空間內存儲更多信息
      • 也就是說,在這麼多bit下,哪幾位存儲哪些內容是不定的
  • 類型指針
    • 作用:對象指向它的類元數據的指針,JVM通過此來確定該對象是哪個類的實例
      • 並非所有JVM的實現都需要這個指針,也就是對象的元數據查找並不一定要經過對象本身

注意:對於數組而言,對象頭中還會記錄數組的長度。JVM可以通過對象的元數據信息確定Java對象的大小。但從數組對象的元數據中是無法獲取數組大小的。

實例數據

  • 作用:對象真正存儲的有效信息,也是在代碼中所定義的各種類型的字段內容
  • 內容:無論是從父類繼承下來的,還是在子類中定義的,都要記錄
  • 存儲順序(HotSpot)
    • 策略:同寬度者分配到一起
    • 具體分配方式:
      • longs/doubles
      • ints
      • shorts/chars
      • bytes/booleans
      • oop(Ordinary Object Pointers)

對齊填充部分

  • 作用:佔位符
  • 並非必須存在
  • HotSpot要求對象其實地址爲8字節的整數倍,也就是要求對象大小是8字節的整數倍
    • 頭部分正好符合要求,當實例數據部分沒有對齊時,就需要通過對齊補充來補全
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章