【过来人推荐】Netty报错:LEAK: ByteBuf.release() was not called before it's garbage-collected

作者: ʘᴗʘ发布时间:2021-12-20 21:13 浏览量:4185 点赞:3439 售价:0

初学者使用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会让很多新手崩溃。

求打赏

如果本文解决了你的问题,花一毛钱赞助一下作者吧!

版权声明:《【过来人推荐】Netty报错:LEAK: ByteBuf.release() was not called before it's garbage-collected》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:https://www.coderbbb.com/articles/60

其它推荐:

user

ʘᴗʘ

77
文章数
52605
浏览量
41988
获赞数
67.80
总收入

本文目录