在使用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就行了