bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

javaobject對象在heap中的結構是什么

java object對象在heap中的結構是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。      

成都創(chuàng)新互聯(lián)專注于企業(yè)營銷型網站建設、網站重做改版、盤山網站定制設計、自適應品牌網站建設、HTML5商城網站定制開發(fā)、集團公司官網建設、外貿營銷網站建設、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為盤山等各大城市提供網站開發(fā)制作服務。

簡介

在之前的文章中,我們介紹了使用JOL這一神器來解析java類或者java實例在內存中占用的空間地址。

今天,我們會更進一步,剖析一下在之前文章中沒有講解到的更深層次的細節(jié)。一起來看看吧。

對象和其隱藏的秘密

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實例的信息。

看下輸出:

java object對象在heap中的結構是什么

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

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

Object對象頭

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

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

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

java object對象在heap中的結構是什么

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

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

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

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

且慢!

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

java object對象在heap中的結構是什么

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

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

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

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

實時上,在應用程序中,這種對象的指針是非常非常多的,從而導致如果同樣一個程序,在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有什么區(qū)別嗎?

我們用JOL再看一次:

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

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

java object對象在heap中的結構是什么

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

整個對象的結構

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

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

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

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

更多精彩內容

1

看動畫學算法之:排序-歸并排序

2

計算機揭秘之:網絡分類和性能分析

3

JVM詳解之:運行時常量池

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

網站標題:javaobject對象在heap中的結構是什么
當前URL:http://vcdvsql.cn/article30/pejdpo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)外貿建站外貿網站建設網站營銷企業(yè)建站搜索引擎優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網站