记netty LEAK: ByteBuf.release() was not called before it‘s garbage-collected异常排查

问题描述:

this4j-->ERROR {ResourceLeakDetector.java:319} - LEAK: ByteBuf.release() was not called before it's garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records: 
#1:
    io.netty.buffer.AdvancedLeakAwareByteBuf.copy(AdvancedLeakAwareByteBuf.java:700)
    io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBodyAttributesStandard(HttpPostStandardRequestDecoder.java:463)
    io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBodyAttributes(HttpPostStandardRequestDecoder.java:505)
    io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBody(HttpPostStandardRequestDecoder.java:360)
    io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.offer(HttpPostStandardRequestDecoder.java:289)
    io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.<init>(HttpPostStandardRequestDecoder.java:154)
    io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.<init>(HttpPostRequestDecoder.java:99)
    io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.<init>(HttpPostRequestDecoder.java:68)
    *********.websocket.netty.NettyHttpServletRequest.<init>(NettyHttpServletRequest.java:42)

排查定位到异常代码:发现每次都是 new decoder的地方报错,查了诸多ByteBuf释放,发现decoder也需要释放,语是补上了绿色部分代码,问题ok

HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(
        new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE), request);
try {
    List<InterfaceHttpData> postDatas = decoder.getBodyHttpDatas();
    if (postDatas != null && postDatas.size() > 0) {
        for (InterfaceHttpData postData : postDatas) {
            if (postData != null) {
                if (postData.getHttpDataType() == InterfaceHttpData.HttpDataType.Attribute) {
                    Attribute attribute = (Attribute) postData;
                    params.put(attribute.getName(), attribute.getValue());
                }
            }
        }
    }

} catch (Exception e) {
    LogUtil.e("NettyHttpServletRequest err", e);
} finally {
    ReferenceCountUtil.safeRelease(request);
    decoder.destroy();
}

感谢文章:

https://blog.csdn.net/hannuotayouxi/article/details/78827499

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值