溫馨提示×

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

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

Java對(duì)象在內(nèi)存中占用多少空間

發(fā)布時(shí)間:2021-06-22 14:39:31 來(lái)源:億速云 閱讀:215 作者:Leah 欄目:大數(shù)據(jù)

Java對(duì)象在內(nèi)存中占用多少空間,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

注意這種計(jì)算方式適用于OpenJDK和Oracle JDK兩個(gè)版本,其它版本可能有所不同。

從整體來(lái)看,java對(duì)象由對(duì)象頭、實(shí)例數(shù)據(jù)、對(duì)齊填充3個(gè)部分組成,其中對(duì)齊填充是指對(duì)象頭的占用空間與實(shí)例數(shù)據(jù)的占用空間如果不是8的整數(shù)倍,就需要添加pad填滿直到總的占用空間為8的倍數(shù)。這里暫時(shí)說(shuō)的8的整數(shù)倍,因?yàn)樵趌ucene源碼中64位的虛擬機(jī)是動(dòng)態(tài)獲取的(具體原因暫時(shí)不清楚,如果像網(wǎng)上和書上說(shuō)的是固定8的整數(shù)倍就沒(méi)必要?jiǎng)討B(tài)獲取了,盡信書不如無(wú)書有些東西沒(méi)看到源碼前最好別下定論),32位是固定的8個(gè)字節(jié)。對(duì)象引用的大小在64位jvm中如果開(kāi)啟指針壓縮為4個(gè)字節(jié)否則8個(gè)字節(jié),在32位jvm中只占4個(gè)字節(jié)。

普通對(duì)象的對(duì)象頭大小為對(duì)象引用的大小加上8字節(jié),數(shù)組的對(duì)象頭等于普通對(duì)象頭的大小加上4個(gè)字節(jié)的和并且要按照8字節(jié)對(duì)齊。

字節(jié)數(shù)組占用的空間=數(shù)組的對(duì)象頭+1*數(shù)組個(gè)數(shù)的和并且按照8字節(jié)對(duì)齊;

boolean數(shù)組的占用空間與字節(jié)數(shù)組的占用空間相同;

char數(shù)組的占用空間=數(shù)組的對(duì)象頭+2*數(shù)組個(gè)數(shù)的和并且按照8字節(jié)對(duì)齊;

short數(shù)組的占用空間與char數(shù)組的占用空間相同;

int數(shù)組的占用空間=數(shù)組的對(duì)象頭+4*數(shù)組個(gè)數(shù)的和并且按照8字節(jié)對(duì)齊;

float數(shù)組的占用空間與int數(shù)組的占用空間相同;

long數(shù)組的占用空間=數(shù)組的對(duì)象頭+8*數(shù)組個(gè)數(shù)的和并且按照8字節(jié)對(duì)齊;

double數(shù)組的占用空間與long數(shù)組的占用空間相同;

對(duì)象數(shù)組與以上數(shù)組稍有不同,數(shù)組中記錄的是所有對(duì)象的引用地址,因此占用空間=數(shù)組的對(duì)象頭+對(duì)象引用的大小*數(shù)組個(gè)數(shù)的和并且按照8字節(jié)對(duì)齊后再加上每個(gè)對(duì)象自身占用的實(shí)際空間;

現(xiàn)在詳細(xì)說(shuō)明每個(gè)對(duì)象的占用空間,除了對(duì)象頭,其中的實(shí)例數(shù)據(jù)部分(不包括靜態(tài)變量)包括基本類型和引用類型(所有的數(shù)組和普通對(duì)象都是引用類型)。引用類型的指針大小在上面已經(jīng)說(shuō)過(guò),指向真正對(duì)象的占用空間就是現(xiàn)在討論的,實(shí)際上這就是一個(gè)遞歸,例如:

class Test{

    int a;

   byte[] b=new byte[10];

}

假設(shè)在64位jvm中指針壓縮的情況下,Test對(duì)象占用的空間=align(對(duì)象頭(4+8)+數(shù)據(jù)(4+4))+size(b)。注意:所有的引用類型不與本對(duì)象在一個(gè)連續(xù)的地址空間中,所以字節(jié)對(duì)齊align時(shí)不能包含引用對(duì)象的實(shí)際大小!

在lucene中為了計(jì)算對(duì)象實(shí)際占用空間就需要實(shí)現(xiàn)Accountable接口,就是因?yàn)楫?dāng)對(duì)象內(nèi)部存在一個(gè)對(duì)象引用時(shí)就需要計(jì)算引用對(duì)象實(shí)際占用空間!

關(guān)于Java對(duì)象在內(nèi)存中占用多少空間問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向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)容。

AI