出現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是不會主動釋放內容的,這個時候需要你自己手動釋放一次。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM