目录
Java对象内存布局和对象头
Object object = new Object()
谈谈你对这句话的理解?一般而言JDK8按照默认情况下,new一个对象占多少内存空间
16字节
位置所在
在JVM堆里的新生代的伊甸园区
对象内存布局
- 对象头
- 实例数据
- 对齐填充
java对象 和数组(数组对象会多一个length),原理其实类似
1.对象头
对象头分为对象标记(markOpp)和 类元信息 (klassOop)
类元信息存储的是指向该对象类元数据(klass)的首地址。
对象标记 
- 在64位系统中,new 一个对象,没有实例数据 ,MarkWord占了8个字节,类型指针占了8个字节,一共是16个字节
MarkWord占了8个字节也就是64bit
类元信息(又叫类型指针)Class Pointer
- 对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是来自哪个类的示例。
尚硅谷宋红康老师的图
- 虚拟机通过这个指针来确定这个对象是哪个类的示例。
只有对象头的实例对象
在64位系统中,MarkWord占了8个字节,类型指针(没有开启压缩指针)占了8个字节,一共是16个字节,但是不管有没有开启压缩指针,都是16字节,开启后类型指针4字节,由于对其填充,还是会将其补到16字节。
查看当前JVM运行参数的指令
java -XX:+PrintCommandLineFlags -version
手动关闭
+是开启,-就是关闭,所以指令是
-XX:-UseCompressedClassPointers
2.实例数据
存放类的属性(Field)信息,包括父类的属性信息
3.对齐填充
虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。
对象头16+实例数据5(int 4 ,boolean 1)+对齐填充3=24字节
本文含有隐藏内容,请 开通VIP 后查看