日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深入理解多線程(三)—— Java的對象頭

上一篇文章中我們從HotSpot的源碼入手,介紹了Java的對象模型。這一篇文章在上一篇文章的基礎(chǔ)上再來介紹一下Java的對象頭。主要介紹一下對象頭的作用,結(jié)構(gòu)以及他和鎖的關(guān)系。

十多年的隴西網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整隴西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“隴西網(wǎng)站設(shè)計”,“隴西網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

Java對象模型回顧與勘誤

在上一篇文章中,關(guān)于對象頭的部分描述有誤,我已經(jīng)在我博客的文章中就行修正 。這里再重新表述一下。

每一個Java類,在被JVM加載的時候,JVM會給這個類創(chuàng)建一個instanceKlass,保存在方法區(qū),用來在JVM層表示該Java類。當我們在Java代碼中,使用new創(chuàng)建一個對象的時候,JVM會創(chuàng)建一個instanceOopDesc對象,這個對象中包含了對象頭以及實例數(shù)據(jù)。

這里提到的對象頭到底是什么呢?

 
 
 
 
  1. class oopDesc { 
  2.   friend class VMStructs; 
  3.  private: 
  4.   volatile markOop  _mark; 
  5.   union _metadata { 
  6.     wideKlassOop    _klass; 
  7.     narrowOop       _compressed_klass; 
  8.   } _metadata; 

上面代碼中的_mark和_metadata其實就是對象頭的定義。關(guān)于_metadata之前就介紹過,這里不再贅述。由于這個專題主要想介紹和JAVA并發(fā)相關(guān)的知識,所以本文展開介紹一下_mark ,即mark word。

對象頭信息是與對象自身定義的數(shù)據(jù)無關(guān)的額外存儲成本,考慮到虛擬機的空間效率,Mark Word被設(shè)計成一個非固定的數(shù)據(jù)結(jié)構(gòu)以便在極小的空間內(nèi)存儲盡量多的信息,它會根據(jù)對象的狀態(tài)復(fù)用自己的存儲空間。

對markword的設(shè)計方式上,非常像網(wǎng)絡(luò)協(xié)議報文頭:將mark word劃分為多個比特位區(qū)間,并在不同的對象狀態(tài)下賦予比特位不同的含義。下圖描述了在32位虛擬機上,在對象不同狀態(tài)時 mark word各個比特位區(qū)間的含義。

同樣,在HotSpot的源碼中我們可以找到關(guān)于對象頭對象的定義,會一一印證上圖的描述。對應(yīng)與markOop.hpp類。

 
 
 
 
  1. enum { age_bits                 = 4, 
  2.       lock_bits                = 2, 
  3.       biased_lock_bits         = 1, 
  4.       max_hash_bits            = BitsPerWord - age_bits - lock_bits - biased_lock_bits, 
  5.       hash_bits                = max_hash_bits > 31 ? 31 : max_hash_bits, 
  6.       cms_bits                 = LP64_ONLY(1) NOT_LP64(0), 
  7.       epoch_bits               = 2 
  8. }; 

從上面的枚舉定義中可以看出,對象頭中主要包含了GC分代年齡、鎖狀態(tài)標記、哈希碼、epoch等信息。

從上圖中可以看出,對象的狀態(tài)一共有五種,分別是無鎖態(tài)、輕量級鎖、重量級鎖、GC標記和偏向鎖。在32位的虛擬機中有兩個Bits是用來存儲鎖的標記為的,但是我們都知道,兩個bits最多只能表示四種狀態(tài):00、01、10、11,那么第五種狀態(tài)如何表示呢 ,就要額外依賴1Bit的空間,使用0和1來區(qū)分。

在32位的HotSpot虛擬機 中對象未被鎖定的狀態(tài)下,Mark Word的32個Bits空間中的25Bits用于存儲對象哈希碼(HashCode),4Bits用于存儲對象分代年齡,2Bits用于存儲鎖標志位,1Bit固定為0,表示非偏向鎖。

markOop.hpp類中有關(guān)于對象狀態(tài)的定義:

 
 
 
 
  1. enum { locked_value             = 0, 
  2.          unlocked_value           = 1, 
  3.          monitor_value            = 2, 
  4.          marked_value             = 3, 
  5.          biased_lock_pattern      = 5 
  6.   }; 

簡單翻譯一下:

 
 
 
 
  1. locked_value(00) = 0  
  2. unlocked_value(01) = 1  
  3. monitor_value(10) = 2  
  4. marked_value(11) = 3  
  5. biasedlockpattern(101) = 5 

關(guān)于為什么要定義這么多狀態(tài),上面提到的輕量級鎖、重量級鎖、偏向鎖以及他們之前的關(guān)系,會在下一篇文章中重點闡述。

【本文是專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文


網(wǎng)站名稱:深入理解多線程(三)—— Java的對象頭
當前路徑:http://www.5511xx.com/article/cdcpesi.html