計(jì)算機(jī)二級(jí)java輔導(dǎo):Java占用內(nèi)存的研究

字號(hào):

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