Java里偏向锁撤销(Revocation)引起的STW停顿优化指南

酷宇酱_2818

酷宇酱_2818

2026-06-08

383人浏览

原创

偏向锁撤销不直接导致gc延迟,但会强制触发全局safepoint停顿,使gc标记阶段被迫排队等待;需通过safepoint日志、偏向锁统计及线程栈分析定位,并在生产环境关闭偏向锁(-xx:-usebiasedlocking)。

java里偏向锁撤销(revocation)引起的stw停顿优化指南

偏向锁撤销本身不直接导致GC延迟,但它会强制触发全局 SafePoint 停顿,而 GC 的标记阶段必须等所有线程进入 SafePoint 才能开始。这意味着:一次看似普通的 synchronized 竞争,可能让整个 JVM 暂停几毫秒——对风控、行情、撮合等低延迟系统而言,这就是超时、堆积甚至熔断的起点。

怎么确认是偏向锁撤销在拖慢系统

别只盯着 GC 日志,关键看 SafePoint 行为:

  • 加参数启动:-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1,观察日志中 safepoint reason 是否高频出现 RevokeBias 或 BulkRevokeBias
  • 配合 -XX:+UnlockDiagnosticVMOptions -XX:+PrintBiasedLockingStatistics,检查输出里的 revoked count 是否持续上升、是否反复突破 BiasedLockingBulkRevokeThreshold=40
  • 用 jstack -l <pid></pid> 抓快照,若大量线程显示 RUNNABLE 却几乎不占 CPU,堆栈又无实际业务逻辑,大概率正卡在等某个线程进入 SafePoint

哪些代码在悄悄触发撤销

很多地方没写 synchronized,却已悄悄让偏向锁失效:

Java Maven Secondary Analysis
Java Maven Secondary Analysis

分析ZIP压缩包或GitLab仓库中的Java Maven项目,确定二次开发范围、类数量、模块分布及生产相关指标。

下载
  • 调用 Object.hashCode() 或 System.identityHashCode():对象头里的线程 ID 必须让位给哈希值,强制撤销
  • 日志打印锁对象:log.info("key = {}", key) → 触发 toString() → 默认调用 hashCode()
  • 用未重写 hashCode() 的对象作 HashMap key:JDK 默认实现同样触发撤销
  • Lombok @Data 自动生成 hashCode():对象一构造完就失去偏向状态

真正管用的优化手段

不要试图“优化撤销过程”,它本质不可控。生产环境应切断源头:

  • 统一添加 -XX:-UseBiasedLocking 关闭偏向锁(JDK 15+ 默认关闭,JDK 8/11 必须显式关)
  • 避免对共享对象调用 hashCode(),尤其在日志、JSON 序列化、Map key 场景中
  • 替换易撤销对象:例如 ConcurrentHashMap 内部 Node 是新分配对象,默认可偏向 → 成为撤销热点;改用 LongAdder 或 ThreadLocal 缓存
  • 如必须用 synchronized,确保临界区极短(微秒级),不跨方法、不跨 IO、不跨网络调用

为什么批量撤销影响这么大

撤销不是按对象算,而是按类聚合:

  • JVM 对每个 class 统计撤销次数,达到 40 次后,对该 class 所有新对象禁用偏向锁
  • 一个缓存 key 类(如 OrderKey)被多线程轮番访问几十次,整类对象就永久降级,后续所有实例都走轻量级锁路径
  • 一次批量撤销可能波及成百上千个同类型对象,每个撤销都要走一遍 STW 流程

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10317

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7442

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6532

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1124

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

928

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1356

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2709

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20031

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1195

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习