出现io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1的原因及解决办法
错误信息
在使用Netty构建Server服务器的时候,之前用得好好的,最近整理了一下就出现了以下错误:
WARN (AbstractChannelHandlerContext.java:294)- An exception 'java.lang.NullPointerException' [enable DEBUG level for full stacktrace] was thrown by a user handler's exceptionCaught() method while handling the following exception:
io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
at io.netty.buffer.AbstractReferenceCountedByteBuf.toLiveRealCnt(AbstractReferenceCountedByteBuf.java:181)
at io.netty.buffer.AbstractReferenceCountedByteBuf.release0(AbstractReferenceCountedByteBuf.java:133)
分析的文章很多,这里有两篇比较靠谱的:
1、netty的异常分析 IllegalReferenceCountException refCnt: 0, decrement: 1
2、Netty中常见的IllegalReferenceCountException异常原因及解决
原因分析
从以上的分析文章中发现,SimpleChannelInboundHandler会自动释放内存(虽然这是一种软释放)即是refCnt引用数减一。
而本人在使用SimpleChannelInboundHandler作为Server端的时候,自己手动释放了一次msg的内存,导致refCnt引用数为0,这个时候框架试图去释放一次,就报如上错误。释放代码如:
msg.release();
我都解决方法是删除上面一行代码,然后就不再出现以上错误。
因此建议全局搜索下release方法,看看是不是重复释放了一次内存造成的该异常,当然前提是你使用了SimpleChannelInboundHandler作为Handler处理事务,使用AbstractChannelInboundHandler是不会主动释放内容的,这个时候需要你自己手动释放一次。