本文目录#

固定(Pinning)问题概述#

虚拟线程遇到同步块、native 方法或阻塞 I/O 时可能被固定到平台线程,失去调度优势。理解哪些场景会触发 Pinning 并监控相应事件,是使用 Loom 的前提。

典型触发场景#

  • synchronized/ReentrantLock 长时间持锁;
  • 调用未适配 Loom 的 native 方法;
  • 使用旧版 JDBC 驱动、阻塞式 I/O;
  • ThreadLocal 中保存大对象并长时间持有。

诊断方法#

  • JFR 事件 VirtualThreadPinned, VirtualThreadBlocked;
  • jcmd Thread.print -virtual 查看虚拟线程状态;
  • 结合 Async-profiler -e wall 分析长时间阻塞。

避免策略#

  • 使用 java.util.concurrent 中的非阻塞组件;
  • 更新数据库驱动至 Loom 友好版本或使用 R2DBC;
  • 将耗时 I/O 包装成 CompletableFuture.supplyAsync() 并切换自定义线程池。

自检清单#

  • 是否在日志/监控中记录 Pinning 事件数量?
  • 是否用 JFR 回溯固定时间 > 100ms 的调用栈?
  • 是否在上线前使用压力测试验证虚拟线程吞吐?

参考资料#


本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。