接口偶发 800 毫秒卡顿,GC 日志里没有对应停顿,-Xlog:safepoint 显示 VM_RevokeBias 一天触发四万次,单次最长 780 毫秒。日志里能对上时间点,这种反而好排。
偏向锁撤销需要所有线程到达安全点,高并发下锁竞争频繁,撤销请求排队,安全点等待被拉长。JDK 15 之后偏向锁默认关闭也是这个原因。这一点先确认清楚,后面就不用反复试。
java -Xlog:safepoint=info -XX:-UseBiasedLocking -jar app.jar grep -i 'RevokeBias' /var/log/app/safepoint.log | wc -l jcmd 21455 VM.info | grep -i safepoint
「偏向锁撤销」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:先开 safepoint 日志确认停顿来自 RevokeBias 而不是 GC;JDK 15 以上直接加 -XX:-UseBiasedLocking 关闭;JDK 8 上评估关闭偏向锁对吞吐的影响 压测对比;同时减少无谓的同步块 缩小竞争面。
结果对不对很好判断,safepoint 日志里最长停顿降到 100 毫秒以内 接口不再出现规律性卡顿。
