Java对象内存布局

发布于:2023-01-04 ⋅ 阅读:(362) ⋅ 点赞:(0)

目录

Java对象内存布局和对象头

位置所在

 对象内存布局

1.对象头

  对象标记 ​编辑

 类元信息(又叫类型指针)Class Pointer

2.实例数据

 3.对齐填充


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 后查看