最近對程序占用內存方面做了一些優化取得了不錯的效果總結了一些經驗
簡要說一下相信會對大家寫出優質的程序有所幫助
下面的論述針對位系統對位系統不適用後敘經常你寫了一個程序一測試功能沒問題一看內存占用也不多就不去考慮其它的東西了但可能程序使用了一個什麼數據結構會當數據規模變大時內存占用激增
基本&&關鍵的問題是Java裡各種東東占多少內存?
對於primitive類型有個byte short int long float double char boolean 它們的長度分別是
這個不羅嗦了舉例來說
long[] data=new long[];
占用內存 * bytes
此外data本身是一個Object也占用內存若干後敘當然它針對 *來說忽略不計再說Object的占用在說這個之前先說說引用一慣的說法是Java裡沒有指針了只有引用引用是安全的
這個說法沒錯但是從機理上來說引用就是指針只是jvm對指針的使用檢查和限制很多這個引用/指針變得很安全
直接來結論一個引用占byte 在位系統上
Object obj=null; //byte
Object[] objs=new Object[]; //至少*byte
你看我定義了一個 obj還是null就占byte
定義了一個 objs個元素但都是null啊就都每個占byte
雖然obj==null但它已經是 一個引用或者說一個指針了
指針也要占地方
接下來直接給另一個結論 Object占byte注意純Object
Object obj=new Object(); //多少????
byte?? 錯!! byte忘了還有一個引用byte是Object的內容
記住 Object obj=new Object(); 占byte
Object[] objs=new Object[];
for(int i=;i<;i++) {
objs[i]=new Object();
}
至少占用 * bytes
推論 Object占bytes似乎和上面的結論矛盾??!!
沒有!! 不管Object沒有被垃圾回收之前總得被別人引用吧?總的有指針指它吧? 既然指那個引用or指針就要占地方啊 byte加起來是byte反正一個Object至少 bytes還是直接給結論推導的過程我就都包辦了咱不是髒活累活搶著干麼!!
一個Integer占 bytes
這時您可能會有疑問Integer=Object+int就是
public class Integer {
public int value;
}
Integer應該占 += bytes啊
你說的有道理但是jvm對所有的Object有限制!這個限制被我發現了就是不管什麼Object占的空間要是的倍數不是的倍數只能是了!
推論Byte也占bytes!
問Byte[] bytes=new Byte[];占用空間多少?
答 約為(至少為) (+)* bytes
論題數組空間占用怎麼算?
我這裡直接給結論了推導這個花了更長的時間對於數組來說數組這個Object有一個length屬性數組的元素相當於其成員
public class Array {
public int length;
// 其它成員
}
[] []
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27226.html