精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java對象的內存布局

存儲 存儲軟件 后端
今天來講些抽象的東西 -- 對象頭,因為我在學習的過程中發現很多地方都關聯到了對象頭的知識點,例如JDK中的 synchronized鎖優化 和 JVM 中對象年齡升級等等。

[[343797]]

本文轉載自微信公眾號「小菜亦牛」,作者JaJian  。轉載本文請聯系小菜亦牛公眾號。  

今天來講些抽象的東西 -- 對象頭,因為我在學習的過程中發現很多地方都關聯到了對象頭的知識點,例如JDK中的 synchronized鎖優化 和 JVM 中對象年齡升級等等。要深入理解這些知識的原理,了解對象頭的概念很有必要,而且可以為后面分享 synchronized 原理和 JVM 知識的時候做準備。

對象內存構成

Java 中通過 new 關鍵字創建一個類的實例對象,對象存于內存的堆中并給其分配一個內存地址,那么是否想過如下這些問題:

  • 這個實例對象是以怎樣的形態存在內存中的?
  • 一個Object對象在內存中占用多大?
  • 對象中的屬性是如何在內存中分配的?

 

在 JVM 中,Java對象保存在堆中時,由以下三部分組成:

  • 對象頭(object header):包括了關于堆對象的布局、類型、GC狀態、同步狀態和標識哈希碼的基本信息。Java對象和vm內部對象都有一個共同的對象頭格式。
  • 實例數據(Instance Data):主要是存放類的數據信息,父類的信息,對象字段屬性信息。
  • 對齊填充(Padding):為了字節對齊,填充的數據,不是必須的。

 

對象頭

我們可以在Hotspot官方文檔中找到它的描述(下圖)。從中可以發現,它是Java對象和虛擬機內部對象都有的共同格式,由兩個字(計算機術語)組成。另外,如果對象是一個Java數組,那在對象頭中還必須有一塊用于記錄數組長度的數據,因為虛擬機可以通過普通Java對象的元數據信息確定Java對象的大小,但是從數組的元數據中無法確定數組的大小。

 

它里面提到了對象頭由兩個字組成,這兩個字是什么呢?我們還是在上面的那個Hotspot官方文檔中往上看,可以發現還有另外兩個名詞的定義解釋,分別是 mark word 和 klass pointer。

 

從中可以發現對象頭中那兩個字:第一個字就是 mark word,第二個就是 klass pointer。

Mark Word

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

Mark Word在32位JVM中的長度是32bit,在64位JVM中長度是64bit。我們打開openjdk的源碼包,對應路徑/openjdk/hotspot/src/share/vm/oops,Mark Word對應到C++的代碼markOop.hpp,可以從注釋中看到它們的組成,本文所有代碼是基于Jdk1.8和64位操作系統。

 

Mark Word在不同的鎖狀態下存儲的內容不同,在32位JVM中是這么存的

 

在64位JVM中是這么存的

 

雖然它們在不同位數的JVM中長度不一樣,但是基本組成內容是一致的。

  • 鎖標志位(lock):區分鎖狀態,11時表示對象待GC回收狀態, 只有最后2位鎖標識(11)有效。
  • biased_lock:是否偏向鎖,由于正常鎖和偏向鎖的鎖標識都是 01,沒辦法區分,這里引入一位的偏向鎖標識位。
  • 分代年齡(age):表示對象被GC的次數,當該次數到達閾值的時候,對象就會轉移到老年代。
  • 對象的hashcode(hash):運行期間調用System.identityHashCode()來計算,延遲計算,并把結果賦值到這里。當對象加鎖后,計算的結果31位不夠表示,在偏向鎖,輕量鎖,重量鎖,hashcode會被轉移到Monitor中。
  • 偏向鎖的線程ID(JavaThread):偏向模式的時候,當某個線程持有對象的時候,對象這里就會被置為該線程的ID。在后面的操作中,就無需再進行嘗試獲取鎖的動作。
  • epoch:偏向鎖在CAS鎖操作過程中,偏向性標識,表示對象更偏向哪個鎖。
  • ptr_to_lock_record:輕量級鎖狀態下,指向棧中鎖記錄的指針。當鎖獲取是無競爭的時,JVM使用原子操作而不是OS互斥。這種技術稱為輕量級鎖定。在輕量級鎖定的情況下,JVM通過CAS操作在對象的標題字中設置指向鎖記錄的指針。
  • ptr_to_heavyweight_monitor:重量級鎖狀態下,指向對象監視器Monitor的指針。如果兩個不同的線程同時在同一個對象上競爭,則必須將輕量級鎖定升級到Monitor以管理等待的線程。在重量級鎖定的情況下,JVM在對象的ptr_to_heavyweight_monitor設置指向Monitor的指針。

Klass Pointer

即類型指針,是對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。

實例數據

如果對象有屬性字段,則這里會有數據信息。如果對象無屬性字段,則這里就不會有數據。根據字段類型的不同占不同的字節,例如boolean類型占1個字節,int類型占4個字節等等;

對齊數據

對象可以有對齊數據也可以沒有。默認情況下,Java虛擬機堆中對象的起始地址需要對齊至8的倍數。如果一個對象用不到8N個字節則需要對其填充,以此來補齊對象頭和實例數據占用內存之后剩余的空間大小。如果對象頭和實例數據已經占滿了JVM所分配的內存空間,那么就不用再進行對齊填充了。

所有的對象分配的字節總SIZE需要是8的倍數,如果前面的對象頭和實例數據占用的總SIZE不滿足要求,則通過對齊數據來填滿。

為什么要對齊數據?字段內存對齊的其中一個原因,是讓字段只出現在同一CPU的緩存行中。如果字段不是對齊的,那么就有可能出現跨緩存行的字段。也就是說,該字段的讀取可能需要替換兩個緩存行,而該字段的存儲也會同時污染兩個緩存行。這兩種情況對程序的執行效率而言都是不利的。其實對其填充的最終目的是為了計算機高效尋址。

至此,我們已經了解了對象在堆內存中的整體結構布局,如下圖所示

 

Talk is cheap, show me code

概念的東西是抽象的,你說它是這樣組成的,就真的是嗎?學習是需要持懷疑的態度的,任何理論和概念只有自己證實和實踐之后才能接受它。還好 openjdk 給我們提供了一個工具包,可以用來獲取對象的信息和虛擬機的信息,我們只需引入 jol-core 依賴,如下

  1. <dependency> 
  2.   <groupId>org.openjdk.jol</groupId> 
  3.   <artifactId>jol-core</artifactId> 
  4.   <version>0.8</version> 
  5. </dependency> 

jol-core 常用的三個方法

  • ClassLayout.parseInstance(object).toPrintable():查看對象內部信息.
  • GraphLayout.parseInstance(object).toPrintable():查看對象外部信息,包括引用的對象.
  • GraphLayout.parseInstance(object).totalSize():查看對象總大小.

普通對象為了簡單化,我們不用復雜的對象,自己創建一個類 D,先看無屬性字段的時候

  1. public class D { 

通過 jol-core 的 api,我們將對象的內部信息打印出來

  1. public static void main(String[] args) { 
  2.     D d = new D(); 
  3.     System.out.println(ClassLayout.parseInstance(d).toPrintable()); 

最后的打印結果為

 

可以看到有 OFFSET、SIZE、TYPE DESCRIPTION、VALUE 這幾個名詞頭,它們的含義分別是

  • OFFSET:偏移地址,單位字節;
  • SIZE:占用的內存大小,單位為字節;
  • TYPE DESCRIPTION:類型描述,其中object header為對象頭;
  • VALUE:對應內存中當前存儲的值,二進制32位;

 

可以看到,d對象實例共占據16byte,對象頭(object header)占據12byte(96bit),其中 mark word占8byte(64bit),klass pointe 占4byte,另外剩余4byte是填充對齊的。

這里由于默認開啟了指針壓縮 ,所以對象頭占了12byte,具體的指針壓縮的概念這里就不再闡述了,感興趣的讀者可以自己查閱下官方文檔。jdk8版本是默認開啟指針壓縮的,可以通過配置vm參數開啟關閉指針壓縮,-XX:-UseCompressedOops。

 

如果關閉指針壓縮重新打印對象的內存布局,可以發現總SIZE變大了,從下圖中可以看到,對象頭所占用的內存大小變為16byte(128bit),其中 mark word占8byte,klass pointe 占8byte,無對齊填充。

 

開啟指針壓縮可以減少對象的內存使用。從兩次打印的D對象布局信息來看,關閉指針壓縮時,對象頭的SIZE增加了4byte,這里由于D對象是無屬性的,讀者可以試試增加幾個屬性字段來看下,這樣會明顯的發現SIZE增長。因此開啟指針壓縮,理論上來講,大約能節省百分之五十的內存。jdk8及以后版本已經默認開啟指針壓縮,無需配置。

數組對象

上面使用的是普通對象,我們來看下數組對象的內存布局,比較下有什么異同

  1. public static void main(String[] args) { 
  2.     int[] a = {1}; 
  3.     System.out.println(ClassLayout.parseInstance(a).toPrintable()); 

打印的內存布局信息,如下

 

可以看到這時總SIZE為共24byte,對象頭占16byte,其中Mark Work占8byte,Klass Point 占4byte,array length 占4byte,因為里面只有一個int 類型的1,所以數組對象的實例數據占據4byte,剩余對齊填充占據4byte。

結尾

對象的內存布局和對象頭的概念,特別是對象頭的Mark Word的內容,在我們分析synchronize 和 JVM 垃圾回收年齡代的時候會有很大作用。

 

JVM中大家是否還記得對象在Suvivor中每熬過一次MinorGC,年齡就增加1,當它的年齡增加到一定程度后就會被晉升到老年代中,這個次數默認是15歲,有想過為什么是15嗎?在Mark Word中可以發現標記對象分代年齡的分配的空間是4bit,而4bit能表示的最大數就是2^4-1 = 15。

 

責任編輯:武曉燕 來源: 小菜亦牛
相關推薦

2021-04-25 06:12:19

Java內存布局JVM

2022-07-06 08:05:52

Java對象JVM

2024-07-25 14:18:29

2020-03-23 09:17:32

內存操作系統Windows

2015-11-16 11:22:05

Java對象內存分配

2024-11-27 08:30:41

2013-03-28 09:55:37

Java對象

2025-09-19 09:16:35

2018-07-04 14:43:55

對象模型內存結構內存模型

2023-10-18 13:25:00

操作系統進程

2018-02-08 14:57:22

對象內存分配

2022-11-02 07:23:06

2025-03-03 09:05:56

2018-04-08 08:45:53

對象內存策略

2023-11-28 08:29:31

Rust內存布局

2023-01-31 08:02:18

2025-09-28 01:00:00

2023-02-07 06:47:58

JVM 模塊Java 虛擬機

2009-08-25 09:49:09

C#內存Graphic

2021-07-07 12:01:48

iOS內存對齊
點贊
收藏

51CTO技術棧公眾號

性欧美在线视频| 中文一区一区三区免费| 国产又粗又爽视频| 日本精品黄色| 日韩欧美一级二级三级久久久| 国产 欧美 日本| 日韩美女一级视频| 男人的j进女人的j一区| 久草视频在线资源| 日本福利专区在线观看| 麻豆精品久久精品色综合| 久久香蕉国产线看观看网| 激情小说欧美色图| 欧美亚洲大片| 亚洲一区二区三区四区五区中文| 国产九色91| 中文字幕一区二区三区免费看| 亚洲国产日韩欧美在线| 日韩av最新在线观看| 亚洲黄色片免费| 日韩pacopacomama| 亚洲线精品一区二区三区| 午夜精品福利一区二区| 亚洲 欧美 自拍偷拍| 国内精品伊人久久久久av一坑| 欧洲永久精品大片ww免费漫画| 糖心vlog免费在线观看| 日韩a级大片| 日韩精品中文字幕一区| 777视频在线| 欧美gay视频| 午夜免费久久看| 艳母动漫在线免费观看| 超碰在线影院| 久久精品夜夜夜夜久久| 国产精品一国产精品最新章节| 一区二区三区黄色片| 久久在线91| 91大神福利视频在线| 久久99久久98精品免观看软件 | 久久久久久久久久久一区| 国产99对白在线播放| 蜜桃视频一区二区三区在线观看| 欧美一区二区大胆人体摄影专业网站| 精品无码久久久久久久久| 亚洲自拍偷拍网| 久久亚洲国产成人| 国精品无码一区二区三区| 成人激情开心网| 国产香蕉97碰碰久久人人| 中文字幕在线看高清电影| 另类ts人妖一区二区三区| 精品国产一区二区三区忘忧草| 亚洲天堂av一区二区| 日韩综合av| 在线电影一区二区三区| 手机在线国产视频| 九色精品蝌蚪| 欧美www视频| 麻豆精品国产传媒av| 国产成人tv| 日韩激情视频在线| 欧美熟妇一区二区| 精品国产日韩欧美| 日韩视频中文字幕| 午夜精品福利在线视频| 欧美黄色一级视频| 久久久视频精品| 亚洲第一在线播放| 日av在线不卡| 亚洲精品免费av| 黄色一级大片在线免费看国产| www.欧美.com| 日本精品二区| 国产91在线视频蝌蚪| 日韩私人影院| 亚洲深夜影院| 国产精品r级在线| 一区二区自拍偷拍| 国产又粗又猛又爽又黄91精品| 99re在线视频观看| 亚洲av成人无码网天堂| 欧美韩国日本一区| 国产日韩欧美大片| 日本在线播放一二三区| 在线精品亚洲一区二区不卡| 成人亚洲免费视频| 果冻天美麻豆一区二区国产| 夜夜嗨av色综合久久久综合网| 欧美色视频一区二区三区在线观看| 欧美fxxxxxx另类| 18性欧美xxxⅹ性满足| 亚洲图片中文字幕| 丁香六月综合激情| 色噜噜狠狠一区二区三区| 91麻豆一二三四在线| 欧美午夜激情在线| 久久久久久久久久一区二区| 成人午夜大片| 色哟哟网站入口亚洲精品| 国产在线欧美在线| 麻豆中文一区二区| 精品国产乱码久久久久久郑州公司 | 天天综合天天干| 国产一区在线精品| 欧美中文娱乐网| 美足av综合网| 欧美精选在线播放| 草草影院第一页| 欧美日韩天堂| 国产一区视频在线播放| 日韩专区一区二区| 艳妇臀荡乳欲伦亚洲一区| 青青青在线视频免费观看| 哺乳一区二区三区中文视频| 俺去了亚洲欧美日韩| 亚洲视频 欧美视频| 成人永久aaa| 国产精品久久成人免费观看| 欧美www.| 亚洲精品一区二区三区婷婷月 | 一级日本在线| 色综合天天综合网天天狠天天| 国产成人av片| 亚洲第一天堂| 91精品久久久久久| sese一区| 91久久精品午夜一区二区| 国产精品一区二区入口九绯色| 中文字幕一区二区三区在线视频 | 性欧美videossex精品| 你懂的在线观看一区二区| 久久91精品国产91久久久| 一区二区自拍偷拍| 国产精品欧美久久久久一区二区| 成人久久久久久久久| 国产女人18毛片水真多18精品| 欧美成人免费视频| 国产女人18毛片18精品| 国产精品超碰97尤物18| 中文字幕网av| 色欧美自拍视频| 国产精品一区二区三区久久久 | 亚洲国产精品二十页| 国产精品亚洲二区在线观看| 网曝91综合精品门事件在线| 97人人爽人人喊人人模波多 | 日韩三级不卡| 免费91在线视频| 国产jzjzjz丝袜老师水多| 亚洲情趣在线观看| 一卡二卡三卡四卡五卡| 欧美啪啪一区| 好吊妞www.84com只有这里才有精品 | 欧美国产禁国产网站cc| 中文字幕有码av| 91嫩草亚洲精品| 成人女保姆的销魂服务| 久草中文在线| 欧美tk—视频vk| 精品91久久久| 久久精品人人做人人爽人人| 无码人妻精品一区二区三区66| 精品久久久亚洲| 国产欧美精品在线| 天堂8中文在线| 亚洲第一偷拍网| aaaaaa毛片| 中文字幕一区二区三区四区不卡 | 99久久免费国产精精品| 一区二区三区欧美久久| 成人在线视频免费播放| 欧美一区=区| 一本一道久久久a久久久精品91| 成人激情久久| 91精品国产色综合久久不卡98口| 男操女在线观看| 69久久夜色精品国产69蝌蚪网| 久久久无码精品亚洲国产| 92国产精品观看| 日本激情视频在线播放| 欧美精品九九| 日本不卡一区| 亚洲免费一区三区| 青青青国产精品一区二区| 日韩精品黄色| 日韩欧美国产不卡| 天天干天天操天天操| 亚洲欧洲日韩综合一区二区| 伊人久久一区二区三区| 日韩精品成人一区二区在线| 成人一区二区av| 中文字幕精品影院| 亚洲free性xxxx护士白浆| 最新中文字幕在线播放| 久久精品国产成人| 亚洲 欧美 激情 小说 另类| 欧美一区二区在线免费观看| 丰满少妇乱子伦精品看片| 国产精品第13页| 91精品小视频| 国产精品亚洲综合一区在线观看| aaaaaa亚洲| 欧美日韩亚洲一区| 亚洲欧美日韩综合一区| 精品少妇3p| 亚洲自拍小视频| 欧美在线va视频| 91爱视频在线| 国产偷倩在线播放| x99av成人免费| 国产日产精品久久久久久婷婷| 精品噜噜噜噜久久久久久久久试看 | 久久只有精品| 日韩av三级在线| 欧美日本一区| 亚洲自拍偷拍一区二区三区| 国产亚洲一区| 久热这里只精品99re8久| 亚洲国产一区二区三区网站| 成人黄色av网站| 韩日精品一区| 国产精品福利久久久| 手机在线观看av| 欧美精品久久久久| 在线heyzo| 成人444kkkk在线观看| seseavlu视频在线| 在线精品高清中文字幕| 日韩一区av| 亚洲乱码国产乱码精品精天堂| 免费看国产片在线观看| 精品久久久久久无| 亚洲国产999| 日韩欧美国产三级电影视频| 国产人妖在线播放| 欧美一区二区美女| 国产人妻精品一区二区三区| 4438x亚洲最大成人网| 91国产精品一区| 欧美日本在线观看| 亚洲综合免费视频| 欧美精品电影在线播放| 国产孕妇孕交大片孕| 欧美精品在欧美一区二区少妇 | 亚洲国产日韩欧美在线99| 亚洲第一视频在线播放| 精品欧美久久久| 狠狠综合久久av一区二区| 精品999久久久| 五月婷婷六月色| 精品五月天久久| 蜜桃成人在线视频| 在线观看久久久久久| 欧美18hd| 欧美激情乱人伦一区| www.51av欧美视频| 啪一啪鲁一鲁2019在线视频| 无人区在线高清完整免费版 一区二| 日韩av免费在线播放| 国产一区二区三区影视| 国产精品一区专区欧美日韩| 亚洲午夜剧场| 国产精品国产三级国产专区53| 久久资源综合| 日韩电影免费观看在| 视频在线不卡免费观看| 99亚洲国产精品| 99国产精品| 啊啊啊国产视频| 狠狠色狠狠色综合| www.四虎在线| 久久精品这里都是精品| 91嫩草丨国产丨精品| 亚洲第一久久影院| 国产免费a视频| 欧美一级电影网站| 色就是色亚洲色图| 北条麻妃久久精品| 国产在线88av| 国产日本欧美视频| 精品少妇3p| 一级日韩一区在线观看| 亚洲大胆av| 亚洲污视频在线观看| 成人小视频免费在线观看| 国产在线观看h| 一区二区三区产品免费精品久久75| 欧美一区二区激情视频| 欧美日韩精品系列| 熟妇人妻中文av无码| 在线精品播放av| 成人免费网站观看| 成人妇女淫片aaaa视频| 午夜欧洲一区| 成年在线观看视频| 日本欧美在线看| 中国免费黄色片| 国产精品久久夜| 免费av网站在线| 日韩亚洲电影在线| 1024免费在线视频| 午夜精品蜜臀一区二区三区免费| 青青国产精品| 日本公妇乱淫免费视频一区三区| 国产精品多人| 亚洲小视频网站| 久久久久国色av免费看影院| 久久婷婷国产麻豆91| 欧美日韩电影在线| 九色在线视频蝌蚪| 久久男人的天堂| 国产精品一区二区美女视频免费看| 蜜桃传媒视频麻豆第一区免费观看 | av在线成人| 亚洲韩国在线| 久久久蜜桃一区二区人| 一边摸一边做爽的视频17国产 | 在线观看亚洲黄色| 亚洲精品美女免费| 女囚岛在线观看| 91在线视频九色| 欧美wwwww| 国产精品无码一本二本三本色| 99免费精品视频| 久久久久成人精品无码| 日韩一区二区精品葵司在线| 欧美一区二区三区| 国产精品免费视频久久久| 自拍偷拍精品| 伊人成色综合网| 99精品视频在线观看免费| 国产一级特黄aaa大片| 日韩美一区二区三区| 国产视频在线播放| 成人性生交大片免费观看嘿嘿视频 | 巨胸喷奶水www久久久免费动漫| 欧洲精品久久| 日韩国产一区二| 欧美丰满老妇熟乱xxxxyyy| 色激情天天射综合网| 美女毛片在线看| 国产盗摄xxxx视频xxx69| 色综合中文网| 天天操天天爱天天爽| 欧美韩国一区二区| 97精品久久人人爽人人爽| 日韩日本欧美亚洲| 成人日韩视频| 精品人妻大屁股白浆无码| 成人网页在线观看| 日韩欧美视频在线免费观看| 亚洲第一男人天堂| 成人av免费电影网站| 日本一区二区三区www| 欧美aⅴ一区二区三区视频| 四虎国产成人精品免费一女五男| 欧美日韩国产成人在线免费| 国产在线看片| 国产伦精品一区二区三区视频孕妇| 亚洲午夜电影| 久久久久亚洲av无码专区桃色| 91国模大尺度私拍在线视频| jizz在线观看视频| 91亚洲精品在线| 亚洲天堂黄色| 亚洲av成人无码久久精品 | 日韩av电影在线播放| 欧美一级精品片在线看| 国产毛片久久久久久| 亚洲一区二区精品久久av| 网站黄在线观看| 国产精品亚洲片夜色在线| 一本一本久久a久久综合精品| 国产51自产区| 在线观看日韩毛片| 最新日本在线观看| 久久一区二区三区欧美亚洲| 毛片一区二区三区| 国产亚洲欧美精品久久久久久| 国产视频精品在线| 偷拍自拍亚洲| 欧美二区在线视频| 综合欧美一区二区三区| 国产 日韩 欧美 综合| 国产精品扒开腿爽爽爽视频| 在线电影一区二区| 亚洲国产av一区| 日韩欧美区一区二| 日本综合久久| 国产日韩亚洲欧美在线| 亚洲国产精品成人综合| 亚洲国产剧情在线观看| 国产精品久久久久久久久借妻| 激情文学一区| 91香蕉视频污在线观看| 日韩精品免费在线| 欧一区二区三区| 日本新janpanese乱熟| 午夜欧美在线一二页|