天天看點

JVM了解(不斷更新中)

JVM

  • 在JVM中,對象在堆記憶體中的布局分為三塊區域:對象頭、執行個體資料和對齊填充。
    • 對象頭:采用2個字來存儲(如果對象是數組則會配置設定3個字,多出來的1個字記錄的是數組長度)
      • Mark Word 存儲對象的hashCode、鎖資訊或分代年齡或GC标志等資訊
        • 32位JVM的Mark Word存儲結構
          JVM了解(不斷更新中)
          重量級鎖也就是通常說synchronized的對象鎖,其中指針指向的是monitor對象(也稱為管程或螢幕鎖)的起始位址。
      • Class Metadata Address 類型指針指向對象的類中繼資料,JVM通過這個指針确定該對象是哪個類的執行個體。
    • 執行個體變量:存放類的屬性資料資訊,包括父類的屬性資訊,如果是數組的執行個體部分還包括數組的長度,這部分記憶體按4位元組對齊。
    • 填充資料:由于虛拟機要求對象起始位址必須是8位元組的整數倍。填充僅僅是為了位元組對齊。
  • Monitor 對象(也稱為管程或螢幕鎖)
    • monitor對象存在于每個Java對象的對象頭中(存儲的指針的指向),synchronized鎖便是通過這種方式擷取鎖的,也是為什麼Java中任意對象可以作為鎖的原因,同時也是notify/notifyAll/wait等方法存在于頂級對象Object中的原因