Object o = new Object()在内存中占了多少字节

柔情痞子 提交于 2020-08-09 20:19:43

一、 结论

想要知道 Object o = new Object();在内存中占用了多少字节,可以使用如下方法直观的看到。

  • maven中添加依赖
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.9</version>
</dependency>
  • 写一个测试类
public class ObjectLayOutTest {
    public static void main(String[] args) {
        Object o = new Object();
        System.out.println(ClassLayout.parseInstance(o).toPrintable());
    }
}
  • 代码输出 new Object()的内存占用字节
  • 可以直观的看到 new Object()在内存中占用16个字节。 为什么是16个字节呢,就需要了解对象在内存中的存储布局。

二、对象内存布局

在这里插入图片描述

  • MarkWord:对象头,8字节。包括了对象的hashCode、对象的分代年龄、锁标志位等。结构如下图所示: 在这里插入图片描述
  • classPointer:对象指向它的类元素的指针。在不开启对象指针压缩的情况下是8字节。压缩后变为4字节,默认压缩。
通过命令:java -XX:+PrintCommandLineFlags -version 查看classPointer是否开启压缩

InitialHeapSize=266536512 起始堆大小 MaxHeapSize=4264584192 最大堆大小 UseCompressedClassPointers 压缩指针,一般java是64位的操作系统,那么指针的长度即64位,即8字节,开启此命令后,classPointer压缩为4字节 UseCompressedOops 压缩普通对象指针 普通对象占用4字节

  • padding :用于对象在内存中占用的字节数不能被8整除的情况下,进行补充。

三、Object o = new Object()在内存中占了多少字节

markword 8字节,因为java默认使用了calssPointer压缩,classpointer 4字节,padding 4字节 因此是16字节 如果没开启classpointer默认压缩,markword 8字节,classpointer 8字节,padding 0字节 也是16字节

四、User (int id,String name) User u = new User(1,'张三');占用多少字节

markword 8字节,开启classPointer压缩 ,classpointer 4字节,instance data int 4字节,开启普通对象指针压缩 String 4字节 padding 4 一共24字节

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!