初学者使用netty的时候大概率会遇到以下报错:io.netty.util.ResourceLeakDetector.reportTracedLeak 319 - LEAK: ByteBuf.release() was not called before it's garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
分析:
- 报错原因:ByteBuf没有release释放
- 解决办法:调用release释放即可
真正的难点在于不好找出是哪里报错,以及不知道哪个该释放,哪个不该释放。
作者在多次经历该报错后,逐渐有了经验。总结一下:
-
如果是你自己使用
readBytes
等方法,新建的ByteBuf一定要release释放 -
即使没有显示的新建ByteBuf,而是作为参数传入一个方法,也要release。比如以下代码:
ByteBuf tempBuf = data.readBytes(4); String version = ByteBufUtil.hexDump(tempBuf); tempBuf.release();
这样写是没问题的,如果你改成:
String version = ByteBufUtil.hexDump(data.readBytes(4));
这种写法,java在实际执行的时候其实还会新建变量,依然会报错。
-
netty自己的
@Override
方法中的入参,可以不释放。因为netty自己会维护释放。
总结
解决该问题的核心就是:自己新建的ByteBuf,一定要自己释放。有些是显式新建的,比较容易发现。一些不注意就忽略的“隐式”新建ByteBuf会让很多新手崩溃。
求打赏
如果本文解决了你的问题,花一毛钱赞助一下作者吧!