美文网首页程序员
如何计算java对象的大小?

如何计算java对象的大小?

作者: WinkTink | 来源:发表于2020-10-31 10:21 被阅读0次

1. 了解对象的内存布局?

2. 每部分占用多少字节说明

2.1  对象头区域

2.1.1 对象头 Mark Word 

        在32bit系统占   4B(字节)

        在 64bit系统占 8B 

2.1.2 类型指针 (Klass pointer 对象所属的类的元信息的实例指针 instanceKlass在方法区的地址 )

        指针压缩  (默认开启)

        开启 4B  

        关闭 8B 

2.1.3 数组长度 

        如果这个对象不是数组,占0B 

        如果这个对象是数组,占4B 

         一个数组最多有多少元素 2的32次方 - 1(1B=8bit)

2.2 实例数据 

         类的非静态属性,生成对象时就是实例数据 

         对象属性大小

         boolean 1B 

          byte 1B 

          char 2B 

          short 2B 

          int 4B

          float 4B 

          double 8B 

          long 8B  

          引用类型 

                开启指针压缩 4B   

                关闭指针压缩 8B

2.3 对齐填充 

      Java中所有的对象大小都是8字节对齐 8的整数倍 16B 24B 32B 不可能是30B 如果一个对象占30B + JVM底层会补2B(对齐填充),凑成32字节,达到8字节整数倍

      对齐对齐填充补0 

      为什么要做填充?

      程序更好写 性能更高

3. 计算案例

3.1 没实例数据的对象 (16bytes)

public class CountEmptyObjectSize {

    public static void main(String[] args) {

        CountEmptyObjectSize obj = new CountEmptyObjectSize();

        System.out.println(ClassLayout.parseInstance(obj).toPrintable());

      // 8  +4 +0+ 0 +4 

    }

}

3.2 普通对象(24btyes)

public class CountObjectSize {

    int a =10;

    int b =20;

  public static void main(String[] args) {

           CountObjectSize object =new CountObjectSize();

           System.out.println(ClassLayout.parseInstance(object).toPrintable());

            // 8+4+0 +4*2 +0

    } 

}

3.3 数组对象(关闭指针压缩时,两次填充)

      开启指针压缩(32bytes)

public class CountSimpleObjectSize {

        static int[]arr = {0, 1, 2};

        public static void main(String[] args) {

              CountSimpleObjectSize test1 =new CountSimpleObjectSize();

              System.out.printf(ClassLayout.parseInstance(arr).toPrintable());

              // 8+4+4 +  + 3*4 +4(对其填充)   (开启指针压缩)

        }

}

关闭指针压缩  (40bytes)

      关闭(-XX:-UseCompressedOops) 可以关闭压缩指针

8+8+4 +4(填充) +4*3+ 4(填充)  两段填充

相关文章

  • 如何计算Java对象所占内存的大小

    摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论...

  • 如何计算Java对象所占内存的大小

    摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论...

  • 如何计算java对象的大小?

    1. 了解对象的内存布局? 2. 每部分占用多少字节说明 2.1 对象头区域 2.1.1 对象头 Mark ...

  • 计算Java对象大小

    我们以64位虚拟机讲解 首先我们简单说下Java对象的内存布局 说明1.类型指针默认占用8个字节,如果开启了Use...

  • Java对象大小计算

    你创建的对象真正占了多少内存?作为程序员基本每天都在 new 对象,那么 new 出来的对象真正占用了多少内存呢?...

  • 如何计算Java对象所占内存的大小

    背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设...

  • Java对象的字节大小

    计算Java对象的字节大小Java基本类型长度及对应对象的字节长度 基本类型长度the size of an ob...

  • OC对象的内存分配及内存对齐

    对象是如何分配内存的?对象是如何计算内存大小的呢?对象内存分配跟什么有关? 代码分析 sizeof() 计算一个变...

  • java 内存计算

    一、计算java对象在内存中占用的大小 来源:https://www.coursera.org/learn/alg...

  • java反射-Field

    在之前的文章如何查看java对象大小及其地址中我们已经知道对象在创建的时候就已经知道该对象占用内存的大小,而对于去...

网友评论

    本文标题:如何计算java对象的大小?

    本文链接:https://www.haomeiwen.com/subject/wvgdvktx.html