論述針對32位系統(tǒng),對64位系統(tǒng)不適用,后敘經(jīng)常你寫了一個程序,一測試,功能沒問題,一看內(nèi)存占用也不多,就不去考慮其它的東西了。但可能程序使用了一個什么數(shù)據(jù)結(jié)構(gòu),會當數(shù)據(jù)規(guī)模變大時,內(nèi)存占用激增。
基本&&關(guān)鍵的問題是,Java里各種東東占多少內(nèi)存?
對于primitive類型,有8個:byte short int long float double char boolean 它們的長度分別是:1 2 4 8 4 8 2 1
這個不羅嗦了,舉例來說
long[] data=new long[1000];
占用內(nèi)存 8*1000 bytes
此外,data本身是一個Object,也占用內(nèi)存若干,后敘,當然它針對 8*1000來說,忽略不計,再說Object的占用,在說這個之前,先說說引用,一慣的說法是Java里沒有指針了,只有引用,引用是安全的。
這個說法沒錯,但是從機理上來說,引用就是指針,只是jvm對指針的使用檢查和限制很多,這個引用/指針變得很安全。
直接來結(jié)論:一個引用占4byte ,在32位系統(tǒng)上
Object obj=null; //4byte
Object[] objs=new Object[1000]; //至少4*1000byte
你看我定義了一個 obj,還是null,就占4byte
定義了一個 objs,1000個元素,但都是null啊,就都每個占4byte
雖然obj==null,但它已經(jīng)是 一個引用,或者說一個指針了
指針也要占地方
接下來,直接給另一個結(jié)論: Object占8byte,注意,純Object
Object obj=new Object(); //多少????
8byte?? 錯??! 12byte,忘了還有一個引用,8byte是Object的內(nèi)容
記住 Object obj=new Object(); 占12byte
Object[] objs=new Object[1000];
for(int i=0;i<1000;i++) {
objs[i]=new Object();
}
至少占用 12*1000 bytes
推論: Object占12bytes,似乎和上面的結(jié)論矛盾??!!
沒有??! 不管Object,沒有被垃圾回收之前,總得被別人引用吧?總的有指針指它吧? 既然指,那個引用or指針就要占地方啊 4byte,加起來是12byte,反正一個Object至少 12bytes。還是直接給結(jié)論,推導(dǎo)的過程我就都包辦了,咱不是臟活累活搶著干么??!
一個Integer占 16 bytes
這時您可能會有疑問,Integer=Object+int,就是:
public class Integer {
public int value;
}
Integer應(yīng)該占 8+4=12 bytes啊
你說的有道理,但是jvm對所有的Object有限制!這個限制被我發(fā)現(xiàn)了,就是不管什么Object占的空間,要是8的倍數(shù)。12不是8的倍數(shù),只能是16了!
推論:Byte也占16bytes!
問:Byte[] bytes=new Byte[1000];占用空間多少?
答: 約為(至少為) (16+4)*1000 bytes
論題:數(shù)組空間占用怎么算?
對于數(shù)組來說,數(shù)組這個Object有一個length屬性,數(shù)組的元素相當于其成員。
基本&&關(guān)鍵的問題是,Java里各種東東占多少內(nèi)存?
對于primitive類型,有8個:byte short int long float double char boolean 它們的長度分別是:1 2 4 8 4 8 2 1
這個不羅嗦了,舉例來說
long[] data=new long[1000];
占用內(nèi)存 8*1000 bytes
此外,data本身是一個Object,也占用內(nèi)存若干,后敘,當然它針對 8*1000來說,忽略不計,再說Object的占用,在說這個之前,先說說引用,一慣的說法是Java里沒有指針了,只有引用,引用是安全的。
這個說法沒錯,但是從機理上來說,引用就是指針,只是jvm對指針的使用檢查和限制很多,這個引用/指針變得很安全。
直接來結(jié)論:一個引用占4byte ,在32位系統(tǒng)上
Object obj=null; //4byte
Object[] objs=new Object[1000]; //至少4*1000byte
你看我定義了一個 obj,還是null,就占4byte
定義了一個 objs,1000個元素,但都是null啊,就都每個占4byte
雖然obj==null,但它已經(jīng)是 一個引用,或者說一個指針了
指針也要占地方
接下來,直接給另一個結(jié)論: Object占8byte,注意,純Object
Object obj=new Object(); //多少????
8byte?? 錯??! 12byte,忘了還有一個引用,8byte是Object的內(nèi)容
記住 Object obj=new Object(); 占12byte
Object[] objs=new Object[1000];
for(int i=0;i<1000;i++) {
objs[i]=new Object();
}
至少占用 12*1000 bytes
推論: Object占12bytes,似乎和上面的結(jié)論矛盾??!!
沒有??! 不管Object,沒有被垃圾回收之前,總得被別人引用吧?總的有指針指它吧? 既然指,那個引用or指針就要占地方啊 4byte,加起來是12byte,反正一個Object至少 12bytes。還是直接給結(jié)論,推導(dǎo)的過程我就都包辦了,咱不是臟活累活搶著干么??!
一個Integer占 16 bytes
這時您可能會有疑問,Integer=Object+int,就是:
public class Integer {
public int value;
}
Integer應(yīng)該占 8+4=12 bytes啊
你說的有道理,但是jvm對所有的Object有限制!這個限制被我發(fā)現(xiàn)了,就是不管什么Object占的空間,要是8的倍數(shù)。12不是8的倍數(shù),只能是16了!
推論:Byte也占16bytes!
問:Byte[] bytes=new Byte[1000];占用空間多少?
答: 約為(至少為) (16+4)*1000 bytes
論題:數(shù)組空間占用怎么算?
對于數(shù)組來說,數(shù)組這個Object有一個length屬性,數(shù)組的元素相當于其成員。