日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

淺談java object對象在heap中的結構

瀏覽:31日期:2022-08-11 13:04:10
目錄對象和其隱藏的秘密Object對象頭數組對象頭整個對象的結構對象和其隱藏的秘密

java.lang.Object大家應該都很熟悉了,Object是java中一切對象的鼻祖。

接下來我們來對這個java對象的鼻祖進行一個詳細的解剖分析,從而理解JVM的深層次的秘密。

工具當然是使用JOL:

@Slf4jpublic class JolUsage { @Test public void useJol(){log.info('{}', VM.current().details());log.info('{}', ClassLayout.parseClass(Object.class).toPrintable());log.info('{}', ClassLayout.parseInstance(new Object()).toPrintable()); }}

代碼很簡單,我們打印JVM的信息,Object class和一個新的Object實例的信息。

看下輸出:

[main] INFO com.flydean.JolUsage - # Running 64-bit HotSpot VM.

# Using compressed oop with 3-bit shift.

# Using compressed klass with 3-bit shift.

# WARNING | Compressed references base/shifts are guessed by the experiment!

# WARNING | Therefore, computed addresses are just guesses, and ARE NOT RELIABLE.

# WARNING | Make sure to attach Serviceability Agent to get the reliable addresses.

# Objects are 8 bytes aligned.

# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

10:27:32.311 [main] INFO com.flydean.JolUsage - java.lang.Object object internals:

 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE

      0    12        (object header)                           N/A

     12     4        (loss due to the next object alignment)

Instance size: 16 bytes

Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

10:27:32.312 [main] INFO com.flydean.JolUsage - java.lang.Object object internals:

 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE

      0     4        (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)

      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)

      8     4        (object header)                           86 06 00 00 (10000110 00000110 00000000 00000000) (1670)

     12     4        (loss due to the next object alignment)

Instance size: 16 bytes

Space losses: 0 bytes internal + 4 bytes external = 4 bytes total3

從上面的結果我們知道,在64位的JVM中,一個Object實例是占用16個字節。

因為Object對象中并沒有其他對象的引用,所以我們看到Object對象只有一個12字節的對象頭。剩下的4個字節是填充位。

Object對象頭

那么這12字節的對象頭是做什么用的呢?

如果想要深入了解這12字節的對象頭,當然是要去研讀一下JVM的源碼:src/share/vm/oops/markOop.hpp。

有興趣的小伙伴可以去看看。如果沒有興趣,沒關系,這里給大家一個張總結的圖:

淺談java object對象在heap中的結構

javaObject對象的對象頭大小根據你使用的是32位還是64位的虛擬機的不同,稍有變化。這里我們使用的是64位的虛擬機為例。

Object的對象頭,分為兩部分,第一部分是Mark Word,用來存儲對象的運行時數據比如:hashcode,GC分代年齡,鎖狀態,持有鎖信息,偏向鎖的thread ID等等。

在64位的虛擬機中,Mark Word是64bits,如果是在32位的虛擬機中Mark Word是32bits。

第二部分就是Klass Word,Klass Word是一個類型指針,指向class的元數據,JVM通過Klass Word來判斷該對象是哪個class的實例。

且慢!

有的小伙伴可能發現了問題,之前我們用JOL解析Object對象的時候,Object head大小是12字節,也就是96bits,這里怎么寫的是128bits?

淺談java object對象在heap中的結構

沒錯,如果沒有開啟COOPs就是128bits,如果開啟了COOPs,那么Klass Word的大小就從64bits降到了32bits。

還記得我們之前講的COOPs嗎?

COOPs就是壓縮對象指針技術。

對象指針用來指向一個對象,表示對該對象的引用。通常來說在64位機子上面,一個指針占用64位,也就是8個字節。而在32位機子上面,一個指針占用32位,也就是4個字節。

實時上,在應用程序中,這種對象的指針是非常非常多的,從而導致如果同樣一個程序,在32位機子上面運行和在64位機子上面運行占用的內存是完全不同的。64位機子內存使用可能是32位機子的1.5倍。

而壓縮對象指針,就是指把64位的指針壓縮到32位。

怎么壓縮呢?64位機子的對象地址仍然是64位的。壓縮過的32位存的只是相對于heap base address的位移。

我們使用64位的heap base地址+ 32位的地址位移量,就得到了實際的64位heap地址。

對象指針壓縮在Java SE 6u23 默認開啟。在此之前,可以使用-XX:+UseCompressedOops來開啟。

數組對象頭

java中有一個非常特別的對象叫做數組,數組的對象頭和Object有什么區別嗎?

我們用JOL再看一次:

log.info('{}',ClassLayout.parseClass(byte[].class).toPrintable());log.info('{}',ClassLayout.parseInstance('www.flydean.com'.getBytes()).toPrintable());

上面的例子中我們分別解析了byte數組的class和byte數組的實例:

10:27:32.396 [main] INFO com.flydean.JolUsage - [B object internals:

 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE

      0    16        (object header)                           N/A

     16     0   byte [B.<elements>                             N/A

Instance size: 16 bytes

Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

10:27:32.404 [main] INFO com.flydean.JolUsage - [B object internals:

 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE

      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)

      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)

      8     4        (object header)                           22 13 07 00 (00100010 00010011 00000111 00000000) (463650)

     12     4        (object header)                           0f 00 00 00 (00001111 00000000 00000000 00000000) (15)

     16    15   byte [B.<elements>                             N/A

     31     1        (loss due to the next object alignment)

Instance size: 32 bytes

Space losses: 0 bytes internal + 1 bytes external = 1 bytes total

看到區別了嗎?我們發現數組的對象頭是16字節,比普通對象的對象頭多出了4個字節。這4個字節就是數組的長度。

整個對象的結構

好了,寫到這里我們來總結一下,java對象的結構可以分為普通java對象和數組對象兩種:

淺談java object對象在heap中的結構

數組對象在對象頭中多了一個4字節的長度字段。

大家看到最后的字節是padding填充字節,為什么要填充呢?

因為JVM是以8字節為單位進行對其的,如果不是8字節的整數倍,則需要補全。

以上就是淺談java object對象在heap中的結構的詳細內容,更多關于java object對象在heap中的結構的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲永久精品唐人导航网址| 国产精品嫩模av在线| 亚洲一二av| 久久一区二区三区喷水| 欧美日韩a区| 麻豆一区二区三区| 欧美日本二区| 青草国产精品久久久久久| 午夜一区在线| 日韩av网站在线免费观看| 国产精品丝袜xxxxxxx| 伊人影院久久| 91精品久久久久久久久久不卡| 精品资源在线| 成人午夜毛片| 亚洲国产成人二区| 国产超碰精品| 亚洲欧美日韩精品一区二区| 亚洲乱码一区| 国产欧美日韩一区二区三区四区 | 精品一区欧美| 91久久黄色| 亚洲欧洲国产精品一区| 日韩精品一区第一页| 影院欧美亚洲| 亚洲国产不卡| 日本不卡高清| 青青草视频一区| 日韩和欧美一区二区三区| 婷婷精品在线| 国产精成人品2018| 精品91福利视频| 久久高清精品| 婷婷综合社区| 亚洲人成精品久久久| 免播放器亚洲| 视频一区二区不卡| 国产亚洲人成a在线v网站| 国产精品国产三级在线观看| 久久影视三级福利片| 欧美日一区二区| 亚洲精品影院在线观看| 久久精品国产99国产| 一区在线免费观看| 精品一区二区三区在线观看视频| 成人日韩在线| 亚洲精一区二区三区| 久久av超碰| 免费在线观看日韩欧美| 老牛国内精品亚洲成av人片| 麻豆精品久久久| 久久婷婷激情| 中文字幕免费一区二区| 亚洲成a人片| 亚洲视频电影在线| 精品国产精品国产偷麻豆| 欧美日韩免费观看一区=区三区 | 欧美aaaaaa午夜精品| 日韩欧美午夜| 免费在线视频一区| 日韩免费看片| 亚洲青青久久| 亚洲一级二级| 日韩精品欧美大片| 三级小说欧洲区亚洲区| 国产精品亚洲欧美| 国产精品91一区二区三区| 国产麻豆精品| 不卡av一区二区| 久久国内精品| 在线国产一区二区| 欧美国产免费| 丝袜美腿亚洲色图| 国产精品毛片久久| 天堂俺去俺来也www久久婷婷| 天堂中文av在线资源库| 国产精品一页| 亚洲制服少妇| 免费看精品久久片| 久久精品国产在热久久| 欧美亚洲激情| 麻豆91小视频| 日韩一区中文| 久久人人99| 欧美天堂一区| 亚洲一区久久| 麻豆精品久久久| 视频精品一区二区| 国产日韩电影| 麻豆成人综合网| 久色成人在线| 神马日本精品| 国产成人久久精品麻豆二区 | 亚洲成人免费| 亚洲精品永久免费视频| 国产精品麻豆成人av电影艾秋| 亚洲综合日韩| 91看片一区| 麻豆91精品91久久久的内涵| 综合一区二区三区| 羞羞答答国产精品www一本| 鲁大师精品99久久久| 激情综合网五月| 日韩国产在线| 久久久久久婷| 麻豆久久久久久| 午夜久久tv| 免费视频国产一区| 韩国精品主播一区二区在线观看| 国产精品久久久久久久久久妞妞| 亚洲最大av| 亚洲神马久久| 国产精品美女| 99国产精品久久久久久久| 欧美在线观看视频一区| 国产探花在线精品| 亚洲精品伦理| 美女黄网久久| 日韩制服丝袜先锋影音| 在线亚洲观看| 999国产精品永久免费视频app| 国产精成人品2018| 精品一区二区三区在线观看视频| 久久中文欧美| 国产在线不卡一区二区三区| 国产一区二区三区久久| 精品丝袜久久| 精品久久免费| 日韩成人三级| 91av亚洲| 亚洲二区视频| 亚洲欧美日韩高清在线| 亚洲国产专区校园欧美| 久久久9色精品国产一区二区三区| 日韩电影免费网站| 999久久久国产精品| 91欧美日韩| 国产欧洲在线| 99精品在线观看| 亚洲欧洲一区二区天堂久久| 久久不射网站| 日韩av网站在线免费观看| 国产精品啊v在线| 久久久久久色 | 亚洲欧洲日本mm| 亚洲精品大片| 国产精品红桃| 精品午夜av| 久久精品亚洲人成影院| 中文亚洲欧美| 国产日韩在线观看视频| 国产精品日本一区二区三区在线| 国产精品大片| 蜜臀久久精品| 免费人成在线不卡| 国产精品极品在线观看| 日韩综合精品| 伊人久久一区| 亚洲欧洲免费| 亚洲精品国产精品粉嫩| 免费看久久久| 亚洲天堂黄色| 日韩精品五月天| 日韩精品免费一区二区三区| 丝袜美腿一区二区三区| 国产精品啊啊啊| 久久精品动漫| 中文不卡在线| 中文字幕一区久| 蜜桃成人av| 日欧美一区二区| 亚洲涩涩在线| 日韩精品a在线观看91| 日本不卡视频一二三区| 亚洲精品永久免费视频| 免费国产自久久久久三四区久久| 日本国产欧美| 色吊丝一区二区| 日韩一区二区三区高清在线观看| 热久久久久久| 欧美日韩激情| 在线亚洲国产精品网站| 欧美精品97| 日韩一区精品视频| 久久久精品网| 国产女人18毛片水真多18精品| 99精品网站| 久久av综合| 久久国产直播| 欧美1区二区| 日韩国产欧美一区二区三区| 99国产精品久久久久久久成人热 | 老司机精品久久| 97精品在线| 久久精品一区二区国产| 婷婷综合一区| 成人在线丰满少妇av| 久久精品亚洲| 日韩精品中文字幕吗一区二区| 中文不卡在线|