錯誤信息
在使用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是不會主動釋放內容的,這個時候需要你自己手動釋放一次。
