视频字幕
Java对象在堆内存中的存储结构包含三个重要部分。首先是对象头,它存储对象的元数据信息,是我们今天要重点学习的内容。其次是实例数据,存储对象的字段值。最后是对齐填充,用于保证对象大小是8字节的倍数。对象头在整个对象结构中起着关键作用。
对象头由两个核心组成部分构成。第一部分是Mark Word,也叫标记字,用于存储对象的运行时数据,如哈希码、锁状态等信息。第二部分是类型指针,指向方法区中该对象所属类的元数据。在32位JVM中,对象头总共8字节,而在64位JVM中,由于指针压缩技术,对象头通常是12字节。
Mark Word的结构会根据对象的锁状态发生变化。在无锁状态下,它存储对象的哈希码、GC分代年龄、偏向锁标志和锁标志位。当对象进入偏向锁状态时,Mark Word会存储偏向线程的ID、Epoch值、GC年龄和相应的锁标志位。这种设计使得JVM能够高效地管理对象的锁状态和元数据信息。
Java对象的锁状态转换是一个单向升级的过程。对象初始处于无锁状态,当被首次访问时可能升级为偏向锁。如果出现其他线程竞争,偏向锁会升级为轻量级锁。当竞争变得激烈,自旋次数超过阈值时,轻量级锁最终升级为重量级锁。这个过程是不可逆的,锁只能升级不能降级,这样设计是为了避免频繁的锁状态切换带来的性能开销。
类型指针是对象头的重要组成部分,它指向方法区中该对象所属类的元数据信息。通过类型指针,JVM能够确定对象的具体类型,支持多态和反射等特性。在64位JVM中,为了节省内存空间,引入了压缩指针技术。开启压缩指针后,类型指针从8字节压缩到4字节,显著减少了内存占用,这对于大量对象的应用程序来说是非常重要的优化。