偏向锁批量撤销

code 3将类的偏向标记关闭,之后当该类已存在的实例获得锁时,就会升级为轻量级锁;该类新分配的对象的mark word则是无锁模式。

code 4处理当前正在被使用的锁对象,通过遍历所有存活线程的栈,找到所有正在使用的偏向锁对象,然后撤销偏向锁。

当达到重偏向阈值后,假设该class计数器继续增长,当其达到批量撤销的阈值后(默认40),JVM就认为该class的使用场景存在多线程竞争,会标记该class为不可偏向,之后,对于该class的锁,直接走轻量级锁的逻辑。
如果总撤销数超过另一个阈值(对应 jvm 参数 -XX:BiasedLockingBulkRevokeThreshold,默认值为 40),那么 Java 虚拟机会认为这个类已经不再适合偏向锁。此时,Java 虚拟机会撤销该类实例的偏向锁,并且在之后的加锁过程中直接为该类实例设置轻量级锁(这里说的就是偏向批量撤销)

https://github.com/farmerjohngit/myblog/issues/12
https://www.jianshu.com/p/4758852cbff4

=====

触发批量重偏向后如果频繁撤销,在一定的时间段内超过一定次数则触发批量撤销,时间段通过参数BiasedLockingDecayTime控制,默认是25000ms,次数通过BiasedLockingBulkRevokeThreshold参数控制,默认是40,即25s内该Klass的锁对象oop撤销偏向锁累计超过40次后就触发批量撤销。批量撤销会将将Klass的prototype_header恢复成无锁状态,即新创建的oop的对象头都是无锁状态,不支持使用偏向锁了,然后遍历所有JavaThread的所有栈帧,遍历每个栈帧中包含的BasicObjectLock,如果其关联的锁对象oop是该Klass,则将该锁对象oop的对象头膨胀成轻量级锁。

上述批量动作的触发逻辑都在BiasedLocking::update_heuristics方法中,具体的执行逻辑在BiasedLocking::bulk_revoke_or_rebias_at_safepoint方法中,跟单个撤销不同,批量动作必须在安全点下执行,因为需要遍历所有Java线程的所有栈帧。

https://blog.csdn.net/qq_31865983/article/details/105024397

posted @ 2021-08-05 22:35  TomStudio  阅读(347)  评论(1)    收藏  举报