大数跨境
0
0

一个Java对象到底占多大空间

一个Java对象到底占多大空间 Spring全家桶实战案例
2021-07-18
0
导读:一个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,那这里是需要算上的。

完毕!!!

给个关注+转发


【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读285
粉丝0
内容832