前言:
而今我们对“java对象的大小”大概比较关心,同学们都需要学习一些“java对象的大小”的相关知识。那么小编也在网摘上搜集了一些有关“java对象的大小””的相关内容,希望大家能喜欢,姐妹们快快来学习一下吧!一个对象到底占用多少字节,该如何计算?
首页要借助openjdk 的jol工具
pom.xml中加入:
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.10</version> </dependency>
java对象都是8字节对齐的,不足的需要补齐 也就是始终是8的倍数
简单说先对象的组成:对象头+实例数据+(padding补齐)
对象头的组成:mark word + klass + (数组长度) ;如果是数组类型 才有数组长度的。
mark word = 8个字节
klass = 4个字节
这里输出 可以观察到所有的基本数据类型似乎是排序了从大到小排列,然后我们通过SIZE这一列开始算每8字节为一组,在OFFSET=24的位置由于是boolean占一个字节,OFFSET=28占4个字节,那就是差了8- 1 - 4 = 3个字节,那这里就进行补齐3个字节,继续向下OFFSET=32 占4个字节,那还差8-4=4个字节 需要补齐4个字节
所以总的结果=40 bytes。
如果是数组如下:
char[] cs = new char[36] ; System.out.println(ClassLayout.parseInstance(cs).toPrintable()) ;结果:[C object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 41 00 00 20 (01000001 00000000 00000000 00100000) (536870977) 12 4 (object header) 24 00 00 00 (00100100 00000000 00000000 00000000) (36) 16 72 char [C.<elements> N/AInstance size: 88 bytesSpace losses: 0 bytes internal + 0 bytes external = 0 bytes total
这里char是占2个字节,长度是36,那这里是需要算上的。
标签: #java对象的大小