JAVA一个对象占用多少字节

通过代码计算对象的大小

观察虚拟机配置

java -XX:+PrintCommandLineFlags -version

https://www.iteye.com/blog/brandnewuser-2113828

分析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 class T03_SizeOfAnObject {
    public static void main(String[] args) {
        System.out.println(ObjectSizeAgent.sizeOf(new Object()));
        System.out.println(ObjectSizeAgent.sizeOf(new int[] {}));
        System.out.println(ObjectSizeAgent.sizeOf(new P()));
    }

    //一个Object占多少个字节
    // -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
    // Oops = ordinary object pointers
    private static class P {
                        //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对齐

对象头具体包括什么

对象是怎么定位的

猜你喜欢

转载自www.cnblogs.com/ssskkk/p/12814931.html