成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解多線程(三)—— Java的對象頭

開發 開發工具
每一個Java類,在被JVM加載的時候,JVM會給這個類創建一個instanceKlass,保存在方法區,用來在JVM層表示該Java類。當我們在Java代碼中,使用new創建一個對象的時候,JVM會創建一個instanceOopDesc對象,這個對象中包含了對象頭以及實例數據。

上一篇文章中我們從HotSpot的源碼入手,介紹了Java的對象模型。這一篇文章在上一篇文章的基礎上再來介紹一下Java的對象頭。主要介紹一下對象頭的作用,結構以及他和鎖的關系。

Java對象模型回顧與勘誤

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

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

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

  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其實就是對象頭的定義。關于_metadata之前就介紹過,這里不再贅述。由于這個專題主要想介紹和JAVA并發相關的知識,所以本文展開介紹一下_mark ,即mark word。

對象頭信息是與對象自身定義的數據無關的額外存儲成本,考慮到虛擬機的空間效率,Mark Word被設計成一個非固定的數據結構以便在極小的空間內存儲盡量多的信息,它會根據對象的狀態復用自己的存儲空間。

對markword的設計方式上,非常像網絡協議報文頭:將mark word劃分為多個比特位區間,并在不同的對象狀態下賦予比特位不同的含義。下圖描述了在32位虛擬機上,在對象不同狀態時 mark word各個比特位區間的含義。

同樣,在HotSpot的源碼中我們可以找到關于對象頭對象的定義,會一一印證上圖的描述。對應與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分代年齡、鎖狀態標記、哈希碼、epoch等信息。

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

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

markOop.hpp類中有關于對象狀態的定義:

  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 

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

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

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

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-12-18 16:33:55

多線程對象模型

2024-01-09 08:28:44

應用多線程技術

2022-07-06 08:05:52

Java對象JVM

2024-05-17 12:56:09

C#編程線程

2012-02-14 10:29:02

Java

2018-07-26 20:10:02

編程語言Java多線程

2024-12-31 09:00:12

Java線程狀態

2024-06-06 09:58:13

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數據結構hash函數

2020-07-21 08:26:08

SpringSecurity過濾器

2024-01-29 15:54:41

Java線程池公平鎖

2012-11-22 10:11:16

LispLisp教程

2024-10-09 20:54:16

2018-07-09 15:11:14

Java逃逸JVM

2010-03-12 08:55:06

Java內省反射

2021-09-18 06:56:01

JavaCAS機制

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品成人 | 91xxx在线观看| 亚洲综合激情 | 91影片 | 亚洲一区久久 | 精品视频在线观看 | 午夜精品久久 | 日韩在线播放一区 | 久久久久久久国产精品影院 | 午夜日韩| 国产高清一区二区三区 | 日中文字幕在线 | 人人爽人人草 | 91在线精品一区二区 | 女生羞羞网站 | 综合久久久 | 欧美精品一区二区三区在线播放 | 麻豆久久久久 | 四虎成人av| 中文字幕精品一区 | 天天天操操操 | 亚洲精彩视频 | 99中文字幕 | 色妞av | 亚洲第1页| 亚洲乱码一区二区三区在线观看 | 国产精品久久久久久久久久久久久 | 国产不卡一区在线观看 | av免费网| 国产精品成人一区二区 | 伊人网综合 | 亚洲啪啪 | 国产中的精品av涩差av | 毛片入口 | 国产一区二区影院 | 日本不卡一区 | www国产亚洲精品久久网站 | 人人九九 | 欧美午夜精品久久久久免费视 | 99国产精品久久久久 | 国产精品中文字幕在线观看 |