评论

收藏

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

服务系统 服务系统 发布于:2021-12-30 15:45 | 阅读数:416 | 评论:0

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




  • 对象头/markword:记录对象的分代年龄、锁状态、hashcode/偏向锁的线程Id等
  • ClassPointer指针:指向当前类的class对象
  • 实例数据
  • Padding对齐



数组对象(多了一个数组长度):




  • 对象头/markword
  • ClassPointer指针
  • 数组长度
  • 数组数据
  • Padding对齐



对象大小与操作系统的位数有关(这里以64位机为例)
除操作系统位数外,还与虚拟机配置有关
查看虚拟机配置
java -XX:+PrintCommandLineFlags -version
DSC0000.png

-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字节






关注下面的标签,发现更多相似文章