一个对象在jvm中占用多少字节?首先要知道一个类对象在jvm虚拟机(hotspot)中的组成,由markword、class pointer(类型指针)、instance data(实例数据)、padding(对齐)。网上我看到很多教程就是长篇大论,实际上自己走一遍,实际运行一遍代码就懂了
2025-11-30T06:52:18.png

public class JustTest {
    public static class MyClass {
        //        public int a; //4字节
        //        public int b; //4字节
        //        public Object object; //4字节
    }

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        System.out.println("Object created: " + myClass);

        // 打印对象的内存布局
        System.out.println("--- ClassLayout ---");
        System.out.println(ClassLayout.parseInstance(myClass).toPrintable());

        // 打印总尺寸(包括引用的对象)
        System.out.println("--- GraphLayout (total size) ---");
        System.out.println(GraphLayout.parseInstance(myClass).toPrintable());
        System.out.println("Total size (bytes): " + GraphLayout.parseInstance(myClass).totalSize());
    }
}

2025-11-30T06:52:34.png
如果说类中有其他元素也是一样的,只要是所有字节加起来不能被8整除的,直接padding补全补到能被8整除,也可以说所有的类占用的字节都是8的倍数,同样的我们平时说的虚拟机也是指的64位虚拟机,8字节是64位
2025-11-30T06:52:46.png
其他的类型比如布尔类型也会补
2025-11-30T06:56:18.png
2025-11-30T06:58:08.png
还记得这篇文章最上面图上说的class pointer开启压缩占用4字节吗?打印jvm默认自带的一些参数可以发现,默认帮你开启压缩了,class pointer和instance data都是默认被压缩的
2025-11-30T07:07:38.png