Java对象头的内部结构(new Object这个对象里面到底有什么)及锁状态信息【图文】


1、创建了Customer()实例 和 Account()实例
Java对象头的内部结构(new Object这个对象里面到底有什么)及锁状态信息【图文】_第1张图片
一个对象的内存结构包括:运行时元数据、类型指针、数据类型、对齐填充

2、对象头里包括(64位机器占96位):运行时元数据(Mark Word)(占64位)、类型指针(Klass Point)(占32位)

(1) 运行时元数据里又包括:哈希值(HashCode)、GC分代年龄、锁状态标志

哈希值:31位的对象标识hashCode,采用延迟加载技术。调用方法System.identityHashCode()计算,并会将结果写到该对象头中。它是一个地址,用于栈对堆空间中对象的引用指向,不然栈是无法找到堆中对象的

GC分代年龄(占4位):记录幸存者区对象被GC之后的年龄age,一般age为15(阈值为15的原因是因为age只有4位最大就可以将阈值设置15)之后下一次GC就会直接进入老年代,要是还没有等到年龄为15,幸存者区就满了怎么办,那就下一次GC就将大对象或者年龄大者直接进入老年代。

锁状态标志:记录一些加锁的信息(我们都是使用加锁的话,在底层是锁的对象,而不是锁的代码,锁对象的话,那会改变什么信息来表示这个对象被改变了呢?也就是怎么才算加锁了呢?

答案就是改变这个对象的对象头的锁信息来标识已经加锁,下一个线程来获取是获取不到的,底层是通过比对当前的线程的那个值与它所期望的值是否相同,这时候一直自旋直到与期望值相同,相同就获取到锁,反之则进入到阻塞队列等待&#

你可能感兴趣的:(Java虚拟机,对象内部结构)