一.先来看看理论

空对象占8个字节 

有数据成员的话,你把数据成员按基本数据类型和对象引用分开统计。 
基本数据类型按byte/boolean=1,char/short=2,int/float=4,long/double=8,累加,然后对齐到8的倍数。 
对象引用按每个4字节,累加,然后对齐到8个字节的倍数。 
============= 
对象占用字节数=基本的8字节+基本数据类型所占的+对象引用所占的 
比如 

class A{ 
int a; 
char b; 
}


占 8(基本)+8(int 4+char 2=6,对齐到8)= 16个字节 
再比如: 

class B{ 
Integer a; 
long b; 
byte c; 
}


占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节 
=============== 
如果你是从别的类继承的,父类的也要算上

二.用程序计算

今天吸引我注意的是新引进的 java.lang. instrument 库,支持用java语言来测绘虚拟机中运行的程序。看API 不太好懂,只是有个getObjectSize() 的方法可以得到对象在内存中的容量大小。这个调试的时候通常用得上。测试程序如下:

package com.jack.test;
import java.lang.instrument.Instrumentation;
public class Test {
private static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
Test.inst = inst;
}
public static long sizeOf(Object o) {
assert inst != null;
return inst.getObjectSize(o);
}
public static void main(String[] args) {
System.out.println("Size of Object: " + sizeOf(new Object()));
System.out.println("Size of direct subclass: " + sizeOf(new Test()));
}
}


把该工程打成jar包,如test.jar,在manifest.mf加上Premain-Class: com.jack.test.Test,然后执行以下命令执行

java -javaagent:test.jar com.jack.test.Test


这样大家就可以验证一下上面的理论是否正确罗,呵呵