面试题答案
一键面试Java对象头包含的信息
- Mark Word:
- 存储对象的运行时元数据,如哈希码(HashCode)、对象分代年龄、锁状态标志、偏向锁的线程ID等。其长度在32位和64位虚拟机中分别为32bit和64bit。
- Klass Pointer:
- 指向对象的类元数据的指针,通过它可以找到对象所属的类。在64位虚拟机中,默认开启指针压缩,该指针长度为4字节;若未开启指针压缩,长度为8字节。在32位虚拟机中,长度为4字节。在数组对象中,对象头还会额外包含数组长度。
在垃圾回收方面的作用
- Mark Word中的分代年龄:垃圾回收器依据对象的分代年龄来决定是否回收对象。对象每经历一次Minor GC且未被回收,其分代年龄就会增加。当分代年龄达到一定阈值(通常是15),对象会晋升到老年代,避免在年轻代频繁回收中反复复制。
- 对象是否可达标记:垃圾回收算法(如可达性分析算法)在标记阶段,会借助对象头的某些标志来标记对象是否可达。不可达对象可能会被回收。
在对象锁机制方面的作用
- 偏向锁:Mark Word中记录偏向锁的线程ID。当一个线程访问加锁对象时,若对象处于偏向锁状态且偏向的线程为当前线程,那么该线程无需再次获取锁,直接进入同步块,提高了执行效率。
- 轻量级锁:在轻量级锁状态下,Mark Word记录指向栈中锁记录的指针。线程尝试获取轻量级锁时,会在自己的栈帧中创建锁记录,并将对象头的Mark Word复制到锁记录中,然后尝试用CAS操作将对象头的Mark Word替换为指向锁记录的指针。若成功,则获取到轻量级锁。
- 重量级锁:当轻量级锁竞争激烈升级为重量级锁时,Mark Word会存储指向重量级锁(monitor)的指针。此时,其他线程获取锁时会被阻塞,进入monitor的等待队列。