对象大小的计算

使用 Instrumentation

// 编译
javac ObjSizeTool.java
javac ObjSizeDemo.java

// 打包
jar cvf ObjSizeDemo.jar *.class

// 修改包中 META-INF/MANIFEST.MF, 添加内容
Main-Class: ObjSizeDemo
Premain-Class: ObjSizeTool

// 运行
java -javaagent:ObjSizeDemo.jar -jar ObjSizeDemo.jar
public class ObjSizeDemo {

    static class User {
        private int age;
        private String name;
    }

    public static void main(String[] args) {
        /**
         * 64位虚拟机 + 指针压缩 的情况下输出24
         * 对象头 = 8 (mark work) + 4 (类型指针)
         * 实例数据 = 4 (int类型age字段) + 4(引用类型name字段)
         * 对齐填充 = 4
         */

        /**
         * 64位虚拟机 + 无指针压缩 (-XX:-UseCompressedOops) 的情况下输出32
         * 对象头 = 8 (mark work) + 8 (类型指针)
         * 实例数据 = 4 (int类型age字段) + 8(引用类型name字段)
         * 对齐填充 = 4
         */
        System.out.println(ObjSizeTool.getObjectSize(new User()));
    }

}
public class ObjSizeTool {

    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object obj) {
        return instrumentation.getObjectSize(obj);
    }

}

使用 lucene

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>8.6.0</version>
</dependency>
public class ObjSizeDemo {

    static class User {
        private long id;
        private int age;
        private String name;
    }

    public static void main(String[] args) {

        /**
         * 64位虚拟机 + 指针压缩 的情况下输出32
         * 对象头 = 8 (mark work) + 4 (类型指针)
         * 实例数据 = 8 (long类型id字段) + 4 (int类型age字段) + 4(引用类型name字段)
         * 对齐填充 = 4
         */

        /**
         * 64位虚拟机 + 无指针压缩 (-XX:-UseCompressedOops) 的情况下输出40
         * 对象头 = 8 (mark work) + 8 (类型指针)
         * 实例数据 = 8 (long类型id字段)+ 4 (int类型age字段) + 8(引用类型name字段)
         * 对齐填充 = 4
         */
        System.out.println(RamUsageEstimator.shallowSizeOf(new User()));
        System.out.println(RamUsageEstimator.shallowSizeOfInstance(User.class));
    }

}