在java的对象头中,mark word主要用于表示对象当前的状态。
而Mark Word是一个复用的数据结构。在不同的对象状态下,其存储的数据也不尽相同。
标志位为,
01:表示对象没有被锁定。bitfields中分别存放了对象的identify hash code,分段年龄,偏向锁标志。identify hash code是由System.identityHashCode()获取,它是一个随机的字符串,与对象的内容无关。这个值在对象的生命周期内是不可变的,因此这个值必须被缓存,因为在对象的状态改变的时候,对应的hash值会被覆盖,回复到unlocked的时候,需要将缓存值重新写入。
00:轻量锁标志。bitfields存放了指向lock record的地址,也就是指针。
10:锁膨胀标志(也就是重量锁的时候)。bitfields存放了指向monitor的指针。如果线程B试图获取线程A已经获得到的锁的时候,对象的状态会变成10。
11:gc标志。这个标志只在GC的时候使用,用于表示哪个对象还是可以达到的,也就是不用清除。
01::偏向锁标志。bitfields分别存放了线程ID,epoch,分段年龄,偏向锁标志。
上面提到的分段年龄是指:新建对象的分段年龄为0,之后每次在新生代拷贝一次就年龄+1,当年龄超过一个阈值之后,就会被丢入老年代。