题目描述
在Java中Object o = new Object();
在内存中占用多少个字节?
个人回答
首先对象会放入内存中堆空间。具体在这个Object会在堆内存会放置哪些信息。并占多少字节。我就不知道。
这题给我的话,等通知吧!!
知识整理
1.Object对象会被放置在哪里
(来自知乎)
- 对象(非数组)内存模型
- 对象头
- 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位都要对齐)
- 数组内存模型
3.压缩指针
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工具包打印查看
这样回答,面试官是不是就会点头了呢?评论区见