synchronized鎖優化前傳-Java對象結構解析

我們經常會說到synchronized是一把重量級的鎖,難道是因爲這把鎖有幾斤?我們也常聽到說,在JDK1.6中對其進行了優化,那麼又是怎麼實現的?想了解這些,我們必須先詳細的瞭解Java對象的結構。

 

 

一:Java對象,請掀起你的蓋頭來

 

以下是64位JVM下的對象結構描述:

 

對象結構

可以看到,在Java中,對象的結構主要分爲:對象頭,實例數據以及填充數據需要強調的是,實例數據與填充數據是不一定要有的。如果一個對象中沒有任何的屬性實例,那麼實例數據是可以爲空的。而填充數據的有無則取決於對象頭和實例數據的字節總長度,因爲填空數據要保證整個對象的長度爲8的整數倍,當對象頭加上實例數據的字節總長度已經是8的整數倍了,那麼填充數據爲空。

 

 

對象頭結構

mark-word :默認8個字節。

Klass Point :對象的類型指針,jdk1.8默認開啓指針壓縮後爲4字節,當在JVM參數中關閉指針壓縮(-XX:-UseCompressedOops)後,長度爲8字節。

數組長度:當對象爲數組的時候,纔會有的結構,用來記錄數組的長度信息。

 

對此,我們可以看出,在64位虛擬機中,一個對象頭的長度最小爲8字節(mark-word)+ 4字節(Klass Point,默認開啓的指針壓縮)= 12個字節。而對象的長度必須爲8字節的整數倍,那麼就必須還有4字節的填充數據,那麼一個對象就最少有16個字節的長度。

 

Mard-Word

記錄對象的HashCode,分代年齡,鎖類型等信息,長度爲8個字節。而synchronized鎖在不同的場景下會進行相關的升級優化,其記錄的鎖的類型是在變化的。

相關鎖的類型可分爲:無鎖,偏向鎖,輕量鎖,重量鎖,以及GC標記,一共五種。當出現鎖的相關競爭問題時,其鎖類型會不斷的進行升級優化,由偏向鎖升級爲輕量鎖,輕量鎖升級爲重量鎖。而2bit的話最多隻能標記4種狀態,所以這裏又多加了1bit,用來標記是否爲偏向鎖(哈哈,就是這麼的淳樸)。

 

二:Java對象,請顯現出你的真身

我們可以通過工具可以分析下它的具體結構,maven地址如下:

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.9</version>
</dependency>

  Object obj = new Object();
  obj.hashCode();  //顯示調用下
  String classInfo = ClassLayout.parseInstance(obj).toPrintable();
  System.out.println(classInfo);

通過ClassLayout分析出其具體結構如下:

我們可以看到這個對象一共是16個字節(最後一個偏移量12字節+自身的4個字節),其中對象頭12個字節,還有4個字節的填充數據。

而在對象頭的12個字節中,我們知道有8個字節是mark-word,另外的4個字節爲Klass Point 類型指針(默認開啓了指針壓縮),那麼我們通過虛擬機參數(-XX:-UseCompressedOops)關閉指針壓縮再看下效果:

這個時候對象的結構竟然只剩下對象頭信息了,mark-word還是8個字節未變(可與上圖對比VALUE的取值),而類型指針Klass Point 由開啓壓縮時的4個字節變成了8字節。(這些敘述可以結合最開始的對象結構示意圖來好好理解下,那張圖也是畫了很久的呀)

看完這些我們在看看VALUE取值是什麼含義?而這個是涉及到synchronized鎖優化的重點,因爲它記錄着鎖類型的關鍵信息 以及 HashCode ,分代年齡等信息。

頭節點的前8個字節表示mark-word,可以看到這裏的new Object()的hashCode的值爲0x7ea987ac,而截圖中的Value中的取值也有對應的取數,只是‘倒’過來一樣,那這是怎麼回事?

 

這裏就涉及到‘大端存儲與小端存儲’的區別:

  • Big-Endian:高位字節存放於內存的低地址端,低位字節存放於內存的高地址端

  • Little-Endian:低位字節存放於內存的低地址端,高位字節存放於內存的高地址端

所以其mark-word的結構如下:

可以看到,最後的3bit(1bit標識偏向鎖,2bit描述鎖的類型)是跟鎖相關的,而synchronized的鎖優化升級就是修改的這幾位上的標識用來區分不同的鎖,從而採取不同的策略來提升性能。而關於synchronized的鎖優化升級的細節,我將在下文詳細的解析。

閱讀我的原文

更多的深度文章解析,你可以關注我的公衆號 :南瓜小燈

希望能夠共同的學習成長!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章