Object obj=new Object()占用字节

对象内存中可以分为三块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding),以64位操作系统为例(未开启指针压缩的情况)Java对象布局如下图所示:

Object obj=new Object()占用字节

这是网上很多人都会提到的一个问题,那么结合上面的Java内存布局,我们来分析下,以64位操作系统为例,new Object()占用大小分为两种情况:

  • 未开启指针压缩        占用大小为:8(Mark Word)+8(Class Pointer)=16字节
  • 开启了指针压缩(默认是开启的)        开启指针压缩后,Class Pointer会被压缩为4字节,最终大小为:8(Mark Word)+4(Class Pointer)+4(对齐填充)=16字节
<dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.10</version>
 </dependency>

 

import org.openjdk.jol.info.ClassLayout;

public class HeapMemory {
    public static void main(String[] args) {
        Object obj = new Object();
        System.out.println(ClassLayout.parseInstance(obj).toPrintable());
    }
}

 

 

 最后的结果是16字节,没有问题,这是因为默认开启了指针压缩,那我们现在把指针压缩关闭之后再去试试。

-XX:+UseCompressedOops  开启指针压缩
-XX:-UseCompressedOops  关闭指针压缩

再次运行,得到如下结果:

 新建一个类,内部只有一个byte属性:

public class MyItem {
    byte i = 0;
}

开启指针压缩,占用16字节:

 

 关闭指针压缩,占用24字节:

 

 在看如下类中添加了 int,long,boolean

 

 

 添加string 常量

 boolean类型补到int类型 加3个字节,string 指针4个字节

 

 

....

 

https://mp.weixin.qq.com/s/YJsTPd7YDzBqdWsNxnygrA

posted @ 2022-04-23 21:49  Nausicaa0505  阅读(65)  评论(0编辑  收藏  举报