java - Netty发布后资源仍然泄漏

标签 java netty

为什么以下内容被视为泄漏?

2016-12-04 09:24:01,534 ERROR [epollEventLoopGroup-2-1] [io.netty.util.ResourceLeakDetector] - LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki
/reference-counted-objects.html for more information.
Recent access records: 5
#5:
        io.netty.buffer.AdvancedLeakAwareByteBuf.release(AdvancedLeakAwareByteBuf.java:955)
        com.example.network.listener.netty.PreprocessHandler.handle(PreprocessHandler.java:42)
        com.example.network.listener.netty.UdpHandlerChain.handle(UdpHandlerChain.java:17)
        com.example.network.listener.netty.UdpRequestExecutor$1.run(UdpRequestExecutor.java:89)
        java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        java.lang.Thread.run(Thread.java:745)
#4:
        io.netty.buffer.AdvancedLeakAwareByteBuf.readBytes(AdvancedLeakAwareByteBuf.java:495)
        com.example.network.listener.netty.PreprocessHandler.handle(PreprocessHandler.java:39)
        com.example.network.listener.netty.UdpHandlerChain.handle(UdpHandlerChain.java:17)
        com.example.network.listener.netty.UdpRequestExecutor$1.run(UdpRequestExecutor.java:89)
        java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        java.lang.Thread.run(Thread.java:745)
#3:
        io.netty.buffer.AdvancedLeakAwareByteBuf.retain(AdvancedLeakAwareByteBuf.java:927)
        io.netty.buffer.AdvancedLeakAwareByteBuf.retain(AdvancedLeakAwareByteBuf.java:35)
        io.netty.util.ReferenceCountUtil.retain(ReferenceCountUtil.java:36)
        io.netty.channel.DefaultAddressedEnvelope.retain(DefaultAddressedEnvelope.java:89)
        io.netty.channel.socket.DatagramPacket.retain(DatagramPacket.java:67)
        io.netty.channel.socket.DatagramPacket.retain(DatagramPacket.java:27)
        io.netty.util.ReferenceCountUtil.retain(ReferenceCountUtil.java:36)
        com.example.network.listener.netty.UdpRequestExecutor.channelRead(UdpRequestExecutor.java:71)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
        io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351)
        io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
        io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926)
        io.netty.channel.epoll.EpollDatagramChannel$EpollDatagramChannelUnsafe.epollInReady(EpollDatagramChannel.java:580)
        io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:402)
        io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:307)
        io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
        io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
        java.lang.Thread.run(Thread.java:745)
#2:
        Hint: 'UdpRequestExecutor#0' will handle the message from this point.
        io.netty.channel.DefaultAddressedEnvelope.touch(DefaultAddressedEnvelope.java:117)
        io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:85)
        io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:27)
        io.netty.channel.DefaultChannelPipeline.touch(DefaultChannelPipeline.java:107)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:356)
        io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351)
        io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)
        io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926)
        io.netty.channel.epoll.EpollDatagramChannel$EpollDatagramChannelUnsafe.epollInReady(EpollDatagramChannel.java:580)
        io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:402)
        io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:307)
        io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
        io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
        java.lang.Thread.run(Thread.java:745)
#1:
        Hint: 'DefaultChannelPipeline$HeadContext#0' will handle the message from this point.
        io.netty.channel.DefaultAddressedEnvelope.touch(DefaultAddressedEnvelope.java:117)
        io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:85)
        io.netty.channel.socket.DatagramPacket.touch(DatagramPacket.java:27)
        io.netty.channel.DefaultChannelPipeline.touch(DefaultChannelPipeline.java:107)
        io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:356)
        io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926)
        io.netty.channel.epoll.EpollDatagramChannel$EpollDatagramChannelUnsafe.epollInReady(EpollDatagramChannel.java:580)
        io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:402)
        io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:307)
        io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
        io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
        java.lang.Thread.run(Thread.java:745)
Created at:
        io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:271)
        io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:179)
        io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:170)
        io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:131)
        io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator$MaxMessageHandle.allocate(DefaultMaxMessagesRecvByteBufAllocator.java:73)
        io.netty.channel.RecvByteBufAllocator$DelegatingHandle.allocate(RecvByteBufAllocator.java:124)
        io.netty.channel.epoll.EpollDatagramChannel$EpollDatagramChannelUnsafe.epollInReady(EpollDatagramChannel.java:544)
        io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:402)
        io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:307)
        io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
        io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
        java.lang.Thread.run(Thread.java:745)

最后一次访问是显式的release()...

我使用的是 Netty 4.1.6.Final。

最佳答案

异常消息指向Netty Wiki 。从该信息和跟踪来看,它看起来像是在 com.example.network.listener.netty.UdpRequestExecutor.channelRead(UdpRequestExecutor.java:71) 处调用 buf.retain()错了。无论如何,在 GC 时,您的缓冲区引用计数为 > 0。您应该研究示例和责任矩阵,以便正确使用重新计数。

关于java - Netty发布后资源仍然泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40957438/

相关文章:

Java - List<Object> 类型的方法 DescendingIterator() 未定义

java - Dagger-2:如何根据其范围为同一对象类型创建不同的实例化?

java - 数据包被 netty 损坏

java - Netty 与 Apache MINA

小程序中的 Netty 和代理服务器

java - 如何使用 JNI 在构建器 C++ 应用程序中启动 JVM

java - 递归地找到二叉搜索树中每个节点的总深度?

java - 从 jar 启动时,由 gradle 构建的嵌入式 jetty 应用程序始终返回 500(内部服务器错误)

node.js - Node (或其他语言)中基于网络的应用程序是否有 'middleware' 库?

java - java.lang.UnsupportedOperationException : Reflective setAccessible(true) disabled