要想搞清楚實例對象占用多少空間,首先需要知道Java的數(shù)據(jù)類型彻秆。
Java數(shù)據(jù)類型分為引用數(shù)據(jù)類型和基本數(shù)據(jù)類型楔绞。
引用數(shù)據(jù)類型是由引用變量(refvar)和指向的實際對象兩部分組成的。
引用變量是基本數(shù)據(jù)類型唇兑,存放的是引用指向?qū)嶋H對象的內(nèi)存地址酒朵,實際對象存放在堆中。
這也解釋了為什么說Java方法的參數(shù)傳遞只有值傳遞了扎附,因為傳遞的只是把指向?qū)ο蟮膬?nèi)存地址賦值給了方法參數(shù)中的局部引用變量蔫耽,與C++的引用傳遞并不相同。
9種基本數(shù)據(jù)類型
類型 | 大小 |
---|---|
boolean | 1B |
byte | 1B |
char | 2B |
short | 2B |
int | 4B |
long | 8B |
float | 4B |
double | 8B |
refvar | 4B |
為什么boolean類型是1B而不是1bit呢留夜?
那是因為計算機最小數(shù)據(jù)處理單位是字節(jié)匙铡,所以雖然布爾類型實際只使用1位,但是需要將其他7位補0湊夠1字節(jié)碍粥。
基本概念
在開始計算前鳖眼,還需要明白一些概念:
對象頭
包括兩部分:
- 對象標記(哈希碼、GC標記嚼摩、GC詞數(shù)具帮、同步鎖標記、偏向鎖持有者)低斋,占用8B蜂厅。
- 類元信息(類元信息是指向它的類元數(shù)據(jù)Klass的引用),引用就是占用4B膊畴。
對齊填充
由于對象的存儲空間分配單位是8個字節(jié)掘猿,換句話說分配的空間必須是8B的倍數(shù),若只占用12B唇跨,也會分配16B稠通。
計算空間占用
class Demo {
// +12B 對象頭占用
// +1B
byte b;
// +4B 引用
Object obj1;
// +4B 就算引用指向了對象,但是還是只占用引用本身的空間买猖。
Object obj2 = new Object();
// +4B 此處數(shù)組也是引用類型改橘,實際數(shù)組對象在堆中
double[] d = new double[1000];
}
這樣算下來,是25B玉控,根據(jù)對齊填充原則飞主,需要分配32B。
參考:《碼出高效 Java開發(fā)手冊》
感謝您閱讀本文,關注我的公眾號“語冰Yubing”可接收最新推送碌识,同時也會激勵我堅持創(chuàng)作碾篡。