一.先来看看理论
空对象占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
这样大家就可以验证一下上面的理论是否正确罗,呵呵