Netty引用计数器踩坑

在使用Netty的channel或者channelContext进行write的时候如果发生了netty IllegalReferenceCountException: refCnt: 0,那就是引用计数器的问题

在channelRead0()方法中的ctx.write(in),会报io.netty.util.IllegalReferenceCountException

原因是这是因为Netty有引用计数器的原因,自从Netty 4开始,对象的生命周期由它们的引用计数(reference counts)管理,而不是由垃圾收集器(garbage collector)管理了。
ByteBuf是最值得注意的,它使用了引用计数来改进分配内存和释放内存的性能。在我们创建ByteBuf对象后,它的引用计数是1,当你释放(release)引用计数对象时,它的引用计数减1,如果引用计数为0,这个引用计数对象会被释放(deallocate),并返回对象池。
当尝试访问引用计数为0的引用计数对象会抛出IllegalReferenceCountException异常:
在这里插入图片描述
在使用TextWebSocketFram的时候之前因为想如果每一个通道都去new,那可就可以在for的外边new出来进行复用,结果当然是报错了,后面查阅资料发现,在netty4以上,对象生命周期由引用计数器来管理了,其实就是0,1,1代表可用,0代表不可用,使用release()方法会让这个引用-1,使用retain()使其+1,因为跟进这个TextWebSocketFram里面去会发现其实它本身就是一个ByteBuf

所以只需要在使用的时候进行retain或者重新new就行了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值