溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JVM中深堆和淺堆的認(rèn)識(shí)是怎么樣的

發(fā)布時(shí)間:2021-10-23 16:14:16 來(lái)源:億速云 閱讀:161 作者:柒染 欄目:大數(shù)據(jù)

JVM中深堆和淺堆的認(rèn)識(shí)是怎么樣的,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

一、概念

我們先給出概念,然后再分析。

(1)淺堆表示一個(gè)java對(duì)象結(jié)構(gòu)所占用內(nèi)存的大小,這個(gè)java對(duì)象內(nèi)部包含了三部分?jǐn)?shù)據(jù):對(duì)象頭、實(shí)例數(shù)據(jù)和對(duì)齊填充。

(2)深堆表示一個(gè)java對(duì)象被 GC 回收后,可以真實(shí)釋放的內(nèi)存大小。

如果你有點(diǎn)疑惑,沒(méi)關(guān)系。對(duì)上面出現(xiàn)的那些名詞我們一個(gè)一個(gè)來(lái)解釋。

1、對(duì)象頭

一個(gè)對(duì)象分為三部分:對(duì)象頭、實(shí)例數(shù)據(jù)、對(duì)齊填充。對(duì)象頭又包含了兩部分:標(biāo)記部分和原始對(duì)象引用。

(1)標(biāo)記部分:包括 hashcode、gc 分代年齡、鎖狀態(tài)標(biāo)志、線程持有鎖、偏向線程鎖id,偏向時(shí)間戳,這一部分在32位機(jī)器上為 4 byte,64 位機(jī)器上為 8byte,一般來(lái)說(shuō)我們的機(jī)器都是64位,所以現(xiàn)在默認(rèn)指的是8個(gè)字節(jié)。

(2)原始對(duì)象引用是對(duì)象的指針,通過(guò)這個(gè)指針找到對(duì)象的實(shí)例,該數(shù)據(jù)可以壓縮,32 位機(jī)器上為 4 byte,64位機(jī)器上為 8byte,jdk8默認(rèn)開(kāi)啟壓縮,大小為 4byte。

所以我們可以看到:一個(gè)java對(duì)象的對(duì)象頭大小,沒(méi)壓縮的時(shí)候是16字節(jié),壓縮時(shí)候是12個(gè)字節(jié)。

2、實(shí)例數(shù)據(jù)

指的就是我們的java對(duì)象實(shí)例。這個(gè)很容易理解。

3、對(duì)齊填充

對(duì)齊填充要追根其根源,其實(shí)是到了計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)的學(xué)科。我在大學(xué)的時(shí)候?qū)W到了對(duì)齊填充,和這里是一樣的道理。java中的對(duì)象都是以8個(gè)字節(jié)為單位對(duì)齊,所以每一個(gè)java對(duì)象的大小都是8的整數(shù)倍。

4、保留集

對(duì)象A能直接或者是間接訪問(wèn)其他的對(duì)象,這些對(duì)象集合起來(lái)就是A的保留集。當(dāng)進(jìn)行垃圾回收的時(shí)候,不僅回收A,也會(huì)回收保留集中所有的對(duì)象。

現(xiàn)在我們理解了這些基本的概念,再回過(guò)頭來(lái)好好地看看,深堆和淺堆到底是什么?

淺堆指對(duì)象本身占用的內(nèi)存,不包括其內(nèi)部引用對(duì)象的大小。一個(gè)對(duì)象的深堆指只能通過(guò)該對(duì)象訪問(wèn)到的(直接或間接)所有對(duì)象的淺堆之和,即對(duì)象被回收后,可以釋放的真實(shí)空間。在《實(shí)戰(zhàn)java虛擬機(jī)》中,使用了一個(gè)案例,在這里引用一下:

JVM中深堆和淺堆的認(rèn)識(shí)是怎么樣的

A引用了對(duì)象C,D,對(duì)象B引用了對(duì)象C,E。

對(duì)象A引用了C和D,對(duì)象B引用了C和E。那么對(duì)象A的淺堆大小只是A本身,不含C和D,而A的實(shí)際大小為A、C、D三者之和。

而A的深堆大小為A與D之和,由于對(duì)象C還可以通過(guò)對(duì)象B訪問(wèn)到,因此不在對(duì)象A的深堆范圍內(nèi)。

我們?cè)倥e一個(gè)例子來(lái)分析:1到100,被3整除的數(shù)可以送給對(duì)象A,被5整除的可以送給對(duì)象B。那么在程序退出時(shí)候,進(jìn)行垃圾回收,此時(shí)對(duì)象A的的深堆肯定小于33,對(duì)象B的深堆肯定小于20,這是因?yàn)榇嬖谙?5、30這樣的數(shù),既可以被3整除也可以被5整除,屬于三不管對(duì)象。

代碼就不再演示了,最后的結(jié)果還是使用MAT工具進(jìn)行分析一下。

看完上述內(nèi)容,你們掌握J(rèn)VM中深堆和淺堆的認(rèn)識(shí)是怎么樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI