对象锁会导致被锁定的对象无法晋升老年代吗

感谢邀请。这个问题问得很好,我是这么认为的,当锁对象处于lightweight lock或heavyweight lock状态时,age值会丢失吗?这是不会的。为什么,就lightweight lock状态而言,锁对象的markword存储的是on-stack lock record的指针,那么on-stack lock record里的内容是什么呢?请看下面的示意图:
对象锁会导致被锁定的对象无法晋升老年代吗

由此可见,这相当于一个对markword的间接寻址,通过lock record的指针找到对应栈帧中具体的markword的值,这个值恰恰就是:
对象锁会导致被锁定的对象无法晋升老年代吗

里面有对象的hash值,分代age;由此我们可以得到lightweight lock状态下锁对象的age了吧~
【对象锁会导致被锁定的对象无法晋升老年代吗】 那么heavyweight lock呢?
同样的道理,heavyweight lock时,锁对象的markword存储的是对应ObjectMonitor的指针,参考HotSpot VM源码,可见ObjectMonitor类中有一个markOop类型的_head成员变量,而这个值,恰恰是在锁膨胀的过程中,由on-stack lock record复制过来的。

■网友
谢邀(没想到有人会邀请我)。简单的说,当对象要被轻量级锁定时,申请锁的线程会对该对象的markword进行拷贝,再使用cas操作将对象头指向自己。当线程释放锁的时候,同样使用cas操作将拷贝的对象头再拷贝回去。如果这个操作成功了,轻量级锁就成功的释放了。如果这个操作失败了 意味着在此期间有其它线程试图获得锁,锁膨胀为重量级,那这个线程就要走重量级锁释放的流程(这个过程基本就是唤醒那些等待锁的线程)。当对象处于重量级锁定时,objectmonitor类中会存储有对象的信息(age hashcode)。这个类我也不是特别了解,你可以自己看一下源码?要学习虚拟机的话,推荐关注R大,或者找本书学习(深入理解java虚拟机)


    推荐阅读