对象内存分布(计算对象的大小)
对象的内存分布分为两种:普通对象:
[*]
[*]
[*]对象头/markword:记录对象的分代年龄、锁状态、hashcode/偏向锁的线程Id等
[*]ClassPointer指针:指向当前类的class对象
[*]实例数据
[*]Padding对齐
[*]
数组对象(多了一个数组长度):
[*]
[*]
[*]对象头/markword
[*]ClassPointer指针
[*]数组长度
[*]数组数据
[*]Padding对齐
[*]
对象大小与操作系统的位数有关(这里以64位机为例)
除操作系统位数外,还与虚拟机配置有关
查看虚拟机配置
java -XX:+PrintCommandLineFlags -version
-XX:+UseCompressedClassPointers 对应 ClassPointer指针的大小,开启为4字节 不开启为8字节
-XX:+UseCompressedOops对应对象中引用类型属性的大小,开启为4字节 不开启为8字节
普通对象:
[*]
[*]
[*]对象头/markword: 8字节
[*]ClassPointer指针: 4/8字节
[*]实例数据:
1.基本类型: 和具体数据类型有关(例:byte:1字节,short:2字节,int:4字节)
2.引用类型: 4/8字节
[*]Padding对齐:对象的整体大小必须是8的倍数,当不足时则需要补齐
[*]
数组对象(多了一个数组长度):
[*]
[*]
[*]对象头/markword
[*]ClassPointer指针
[*]数组长度:4字节(一个int)
[*]数组数据
[*]Padding对齐
[*]
举例:
private class User{
//8 对象头/markword
//4/8 ClassPointer指针
int id; //4
String name; //4/8
int age; //4
byte b1; //1
boolean b2; //1
char c1; //2
Object o; //4/8
//0/6 Padding对齐
}
-XX:+UseCompressedClassPointers和-XX:+UseCompressedOops
开启的时候:32字节
关闭的时候:48字节
https://blog.51cto.com/u_15475256/4862570
页:
[1]