2024-10-26  阅读(64)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1777562856

回答

一个空的 Object 对象会占用 16 字节的内存空间。

  • 若启用压缩指针,空 Object 对象默认会占用 12 个字节,但是为了满足内存对齐的要求,JVM 会将对象大小填充为8字节的倍数,所以占用 16 个字节
  • 若关闭压缩指针,空 Object 对象默认占用 16 个字节

所以,无论是否启用压缩指针,一个空的 Object 对象在64位JVM中占16字节的内存。

详解

在 HotSpot 虚拟机中,一个 Java 对象在堆内存里面的内存布局是使用 OOP 结构来表示的,它主要分为三个部分:

一、对象头

在 Java 中每个对象都有一个对象头,对象头通常包括两个部分:

  • Mark Word:用于存储对象的运行时数据,比如哈希码(HashCode)、GC标志、锁状态等。在 64 位 JVM 中,Mark Word 占用8个字节,32 位 JVM 占 4 个字节
  • Class Pointer:类型指针,指向对象的类元数据,JVM通过这个指针知道对象是哪个类的实例。它占用字节数跟 JVM 是否开启压缩指针有关系。在开启指针压缩的状况下占 4 字节,未开启状况下占 8 字节。

二、实例数据

实例数据用于存储对象中的各类类型的字段信息(包括从父类继承来的),空对象为 0。

三、对齐填充