通过代码计算对象的大小
观察虚拟机配置
java -XX:+PrintCommandLineFlags -version
分析java对象的组成
普通对象
对象头:markword 8 (标识对象的状态,被回收了多少次)
ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节(默认开启) 不开启为8字节(对象属于哪个Class)
实例数据 引用类型:-XX:+UseCompressedOops 为4字节(默认开启) 不开启为8字节 Oops Ordinary Object Pointers
Padding对齐,8的倍数 (64位的机器 按块来读,一下子读16个字节)
数组对象
对象头:markword 8
ClassPointer指针同上
数组长度:4字节
数组数据
对齐 8的倍数
用例测试
public classT03_SizeOfAnObject {public static voidmain(String[] args) {
System.out.println(ObjectSizeAgent.sizeOf(newObject()));
System.out.println(ObjectSizeAgent.sizeOf(new int[] {}));
System.out.println(ObjectSizeAgent.sizeOf(newP()));
}//一个Object占多少个字节//-XX:+UseCompressedClassPointers -XX:+UseCompressedOops//Oops = ordinary object pointers
private static classP {//8 _markword//4 _class pointer
int id; //4
String name; //4
int age; //4
byte b1; //1
byte b2; //1
Object o;//4
byte b3; //1
}
}
打印结果:
16 = 对象头8个 + ClassPointer指针 4个 +padding对齐 4个
16 = 对象头8个 + ClassPointer指针 4个 +数组长度 4个 +padding对齐0个
32 = 对象头8个 + ClassPointer指针 4个 + int id 4个 + name的引用四个 + int age 4个+1+1+4+1 + padding对齐
对象头具体包括什么
对象是怎么定位的
原文:https://www.cnblogs.com/ssskkk/p/12814931.html