Java程式計算各種對象所占記憶體的大小的方法。
基類:
public abstract class SizeOf {
private final Runtime s_runtime = Runtime.getRuntime();
/**
*
* 子類負責覆寫該方法以提供被測試類的執行個體
* @return 被測試類的執行個體
*/
protected abstract Object newInstance();
* 計算執行個體的大小(位元組數)
* @return 執行個體所占記憶體的位元組數
* @throws Exception
public int size() throws Exception {
// 垃圾回收
runGC();
// 提供盡可能多(10萬)的執行個體以使計算結果更精确
final int count = 100000;
Object[] objects = new Object[count];
// 執行個體化前堆已使用大小
long heap1 = usedMemory();
// 多執行個體化一個對象
for (int i = -1; i < count; ++i) {
Object object = null;
// 執行個體化對象
object = newInstance();
if (i >= 0) {
objects[i] = object;
} else {
// 釋放第一個對象
object = null;
// 垃圾收集
runGC();
// 執行個體化之前堆已使用大小
heap1 = usedMemory();
}
}
// 執行個體化之後堆已使用大小
long heap2 = usedMemory();
final int size = Math.round(((float) (heap2 - heap1)) / count);
// 釋放記憶體
for (int i = 0; i < count; ++i) {
objects[i] = null;
objects = null;
return size;
}
private void runGC() throws Exception {
// 執行多次以使記憶體收集更有效
for (int r = 0; r < 4; ++r) {
_runGC();
private void _runGC() throws Exception {
long usedMem1 = usedMemory();
long usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {
s_runtime.runFinalization();
s_runtime.gc();
Thread.currentThread().yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
* 堆中已使用記憶體
* @return 堆中已使用記憶體
private long usedMemory() {
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
子類:
public class SizeOfObject extends SizeOf {
@Override
protected Object newInstance() {
return new Object();
public static void main(String[] args) throws Exception {
SizeOf sizeOf = new SizeOfObject();
System.out.println("所占記憶體:" + sizeOf.size() + "位元組");
輸出為:所占記憶體:8位元組
利用序列化(Serializable)計算對象的大小
下面代碼可以計算session的大小:
将session中的所有對象輸出到檔案中,檔案的大小就是對象的大小.
try {
FileOutputStream f = new FileOutputStream("c:/sessionFiles");
ObjectOutputStream s = new ObjectOutputStream(f);
s.writeObject("session:");
HttpSession session = request.getSession(false);
Enumeration names = session.getAttributeNames();
while(names.hasMoreElements()){
s.writeObject(session.getAttribute((String) names.nextElement()));
s.flush();
s.close();
f.close();
} catch (Exception e) {
e.printStackTrace();
也可以看看這個
java對象占記憶體大小