Netty升级4.1.70后管道首个SslHandler收到refCnt为0的ByteBuf原因排查
根因定位
该问题是Netty 4.1.68.Final版本引入的调度逻辑缺陷导致,对应PR 11242的优化改动中未正确处理ByteBuf的引用计数:同一块读取到的ByteBuf被提交到两个独立的异步执行任务,第一个任务处理完成后直接调用了release()回收缓冲区,第二个负责触发管道解码的任务拿到缓冲区时引用计数已经归0,因此SslHandler解码时直接抛出IllegalReferenceCountException。
可行排查与解决路径
- 临时规避方案:可直接回退PR 11242的改动,或者将Netty版本降级到4.1.67.Final,该版本未引入相关调度逻辑改动,可完全规避该问题。
- 精准定位
release()调用的方法:无需追踪全链路异步逻辑,直接在AbstractByteBuf的release()方法上设置条件断点,匹配异常栈中对应ByteBuf的容量、内存地址等特征,即可直接抓到触发释放的调用点。 - 适配验证:如果使用
TCNATIVE类型的OpenSslEngine,可临时切换为JDK内置SSLEngine做对比测试,若切换后问题消失,可确认是调度逻辑和TCNATIVE的缓冲区零拷贝处理逻辑存在冲突。 - 最终修复方案:无需自行修改Netty代码,直接将Netty升级到4.1.71.Final及以上版本即可,官方已在后续迭代中修复了该引用计数的漏洞。
内容的提问来源于stack exchange,提问作者Laird Nelson
相关产品推荐
相关产品推荐

