Shun 发表于 2021-12-30 15:45:05

对象内存分布(计算对象的大小)

对象的内存分布分为两种:
普通对象:

[*]
[*]

[*]对象头/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]
查看完整版本: 对象内存分布(计算对象的大小)