前言
空物件佔8個位元組
有資料成員的話,你把資料成員按基本資料型別和物件引用分開統計。
基本資料型別按byte/boolean=1,char/short=2,int/float=4,long/double=8,累加,然後對齊到8的倍數。
物件引用按每個4位元組,累加,然後對齊到8個位元組的倍數。
物件占用位元組數=基本的8位元組+基本資料型別所佔的
+物件引用所佔的
比如 class a
佔 8(基本)+8(int 4+char 2=6,對齊到8)= 16個位元組
再比如:
class b
佔 8(基本)+8(long8+byte1=9,對齊到8)+8(物件引用4,對齊到8)=32個位元組
===============
如果你是從別的類繼承的,父類的也要算上。
直接上**
實現類public
abstract
class sizeof else
}
rungc();
// 例項化之後堆已使用大小
long heap2 = usedmemory();
final
int size = math.round(((float) (heap2 - heap1)) / count);
// 釋放記憶體
for (int i = 0; i < count; ++i)
objects = null;
return size;
}
private
void rungc() throws exception
}
private
void _rungc() throws exception
}
/**
* * 堆中已使用記憶體
* * @return 堆中已使用記憶體
*/private
long usedmemory()
}
測試public
class sizeofobject extends sizeof
public
static
void main(string args) throws exception
}
輸出為:所佔記憶體:8位元組
利用序列化(serializable)計算物件的大小
下面**可以計算session的大小:
將session中的所有物件輸出到檔案中,檔案的大小就是物件的大小.
try
s.flush();
s.close();
f.close();
} catch (exception e)
java物件占用記憶體情況
32位作業系統中 乙個物件的物件頭占用8位元組,物件中的乙個引用佔4個位元組,需要補齊位8的倍數 一維陣列的為特殊物件,物件頭佔8個位元組,加上4位元組的長度數量,加上陣列長度n 陣列型別 string型別占用的位元組數字40 2n pandding 補齊為8的個數 64位作業系統中 乙個物件的物件...
java 物件記憶體膨脹與Set記憶體占用問題研究
遇到乙個有意思的業務。有兩個單列檔案,乙個500m乙個700m,共1.2g,2e個資料,要將這兩個單列檔案中的資料提取出來去重。最簡單的思路,理論大小為1.2g的資料塞進set裡直接去重,發現程式跑著跑著就跑不動了,用jstat檢視,發現原來沒有賦予初始化引數,預設的初始化堆記憶體太小,導致程式跑不...
程式占用記憶體分析
堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由o...