JAVA對象結構


對象的內存布局

在HotSpot虛擬機中,對象在內存中存儲的布局可以分為3塊區域:對象頭(Header),實例數據(Instance Data)和對象填充(Padding)。

  • 實例數據:對象真正存儲的有效信息,存放類的屬性數據信息,包括父類的屬性信息;
  • 對齊填充:由於虛擬機要求 對象起始地址必須是8字節的整數倍。填充數據不是必須存在的,僅僅是為了字節對齊。
  • 對象頭:Hotspot虛擬機的對象頭主要包括兩部分數據:Mark Word(標記字段)、Class Pointer(類型指針)。

對象頭

對象頭主要包括兩部分數據:Mark Word(標記字段)、Class Pointer(類型指針)。

  • Class Pointer:是對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例
  • Mark Word : 用於存儲對象自身的運行時數據,它是實現輕量級鎖和偏向鎖的關鍵。

Mark word

Mark Word 用於存儲對象自身的運行時數據,如哈希碼(HashCode)、GC分代年齡、鎖狀態標志、線程持有的鎖、偏向線程 ID、偏向時間戳等。

在32位的HotSpot虛擬機中,如果對象處於未被鎖定的狀態下,那么Mark Word的32bit空間里的25位用於存儲對象哈希碼,4bit用於存儲對象分代年齡,2bit用於存儲鎖標志位,1bit固定為0,表示非偏向鎖。其他狀態如下圖所示:

  • 前面分析可知,monitor特點是互斥進行,你再喵一下上圖,重量級鎖,指向互斥量的指針
  • 其實synchronized是重量級鎖,也就是說Synchronized的對象鎖,Mark Word鎖標識位為10,其中指針指向的是Monitor對象的起始地址。
  • 頓時,是不是感覺柳暗花明又一村啦!對象與monitor怎么關聯的?答案:Mark Word重量級鎖,指針指向monitor地址

總圖如下:

鎖的膨脹過程如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM