目录
一、对象内存布局
1.1、对象头(Header)
1.1.1、运行时元数据(Mark Word)
1.1.2、 类型指针
1.2、实例数据(Instance Date)
1.3、对齐填充(Padding)
二、对象访问定位
一、对象内存布局
1.1、对象头(Header)
1.1.1、运行时元数据(Mark Word)
1、哈希值(HashCode) 2、GC分代年龄 3、锁状态标志 4、线程持有的锁 5、偏向线程ID 6、偏向时间戳
1.1.2、 类型指针
指向类元数据InstanceKlass,确定该对象所属的类型
如果是数组,还需要记录数组的长度。
1.2、实例数据(Instance Date)
1、是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来和本身拥有的字段)
2、规则:①、相同宽度的字段总是被分配在一起。 ②、父类定义的变量会在子类之前。 ③、如果CompactFields参数(默认true):子类的窄变量可能插入到父类变量的空隙。
1.3、对齐填充(Padding)
不是必须的,没有特别含义,仅起到占位符的作用。
二、对象访问定位
1、创建对象的目的就是为了使用。
2、JVM是如何通过栈帧中的对象引用访问到其内部的对象实例?
通过栈上reference访问定位
3、访问对象方式主要有两种:
①、句柄访问
②、直接指针(HotSpot采用)