错误异常
- 我们在使用Netty过程中是不是经常遇到如下异常:
io.netty.util.IllegalReferenceCountException: refCnt: 0, increment: 1
at io.netty.buffer.AbstractReferenceCountedByteBuf.release0(
AbstractReferenceCountedByteBuf.java:100)
...
原因
- SimpleChannelInboundHandler 它会自动进行一次释放(即引用计数减1). 源码如下:
@Override
public void channelRead(ChannelHandlerContext ctx,
Object msg) throws Exception {
boolean release = true;
try {
if (acceptInboundMessage(msg)) {
@SuppressWarnings("unchecked")
I imsg = (I) msg;
channelRead0(ctx, imsg);
} else {
release = false;
ctx.fireChannelRead(msg);
}
} finally {
if (autoRelease && release) {
ReferenceCountUtil.release(msg);
}
}
}
解决办法
- ((FullHttpRequest) msg).retain();
- 调用 msg.retain() 方法进行手动计数器加1