java对象头很重要,synchronize、GC、HashCode、biasedLock、ObjectMonitor都是在对象头上做文章。
其实整个Java可以说是构建在oop-klass体系上的,相信从各种技术博客、书籍大家都了解不少。但是基本上都是32位虚拟机下,可能周志明大神的学习笔记太多。
本文不打算讲讲oop-klass体系(能力有限),只聊聊64位虚拟机下普通的对象头,jdk1.8.0_221,jvm参数:-XX:-UseCompressedOops,希望对读者有所帮助。
typedef class oopDesc* oop; class oopDesc{ friend class VMStructs; private: volatile markOop _mark; union _metadata { Klass* _klass; narrowKlass _compressed_klass; } _metadata; } 复制代码
typedef class oopDesc* oop; typedef class instanceOopDesc* instanceOop; typedef class arrayOopDesc* arrayOop; typedef class objArrayOopDesc* objArrayOop; typedef class typeArrayOopDesc* typeArrayOop; 复制代码
仔细看图,相信你就明白了。注意markword=00000008807e2501,其中unused25位,hashcode与integers1.hashcode()相等,2个标志位也ok。
再看一个偏向锁状态的(标志位101)