题目描述

在Java中Object o = new Object();在内存中占用多少个字节?

个人回答

首先对象会放入内存中堆空间。具体在这个Object会在堆内存会放置哪些信息。并占多少字节。我就不知道。
这题给我的话,等通知吧!!

知识整理

1.Object对象会被放置在哪里

image.png
(来自知乎)

  • 在线程所属栈的栈帧中的本地变量表中有 o这么一个指针
  • 指针会指向JVM堆中。Object对象的那块内存

    2.对象内存模型

    image.png(马士兵)
    image.png以64位操作系统为例(未开启指针压缩的情况)
    image.png (搜狐)

image.png
image.png

  1. 对象(非数组)内存模型
  • 对象头
    • mark word:包含一系列的标记位,比如轻量级锁的标记位、偏向锁标记位、gc记录信息等等。在32位系统占4字节,在64位系统中占8字节。
    • Class Pointer:用来指向对象对应的Class对象(其对应的元数据对象)的内存地址。在32位系统占4字节,在64位系统中占8字节。
  • 对象中实际数据
    • Intance data: 对象实际数据。对象实际数据包括了对象的所有成员变量,其大小由各个成员变量的大小决定。(这里不包括静态成员变量,因为它是在方法区维护的)。8种基本类型按照各自大小存放,引用指针32位4字节,64位8字节(若未开启压缩)
  • 对齐填充
    • Java 对象占用空间是 8 字节对齐的,不足8字节的补齐(不管是32位还是64位都要对齐)
  1. 数组内存模型

暂略

3.压缩指针

image.png

  1. java -XX:+PrintCommandLineFlags -version
  • -XX:+UseCompressedClassPointers:压缩对象头中的Class Pointer指针
  • -XX:+UseCompressedOops:压缩普通对象头中的对象引用指针

因此,在64位的JVM下,默认开启了指针压缩。ClassPointer和实际数据中的引用指针被从8字节压缩到了4字节。

4.JOL包的使用过

再次回答

  • 首先我会讲出来Object最终会放在JVM的堆内存中
  • 普通对象的内存结构:对象头:mark word 、calss pointer 、实际数据、补齐
  • 具体占的字节要依据是32位还是64位系统决定
  • 如果是64位系统还要看是否使用指针压缩方式
  • 可以通过JOL工具包打印查看

这样回答,面试官是不是就会点头了呢?评论区见