2016-12-04 5 views
0

Почему следующее считается утечкой?Утечка ресурса 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.

ответ

1

Сообщение об исключении указывает на Netty Wiki. Из этой информации и следов похоже, что звонок buf.retain() в com.example.network.listener.netty.UdpRequestExecutor.channelRead(UdpRequestExecutor.java:71) был неправильным. Во всяком случае во время GC ваш буферный пересчет был > 0. Вы должны изучить примеры и матрицу ответственности за правильность работы с refcounts.

+0

Обратите внимание, что эта ОШИБКА появляется только один раз в моих журналах ... Как это может быть? Сервер получает тонны запросов .... –

+0

Я не знаю, как вы настроили обнаружение утечки. По умолчанию он отображает ~ 1% буферов. В любом случае, для конкретного buf (из журнала) понятно, почему это считается утечкой - чрезмерное использование 'keep()' – IrLED

+0

Это путало меня ... я искал утечку на одном буфере .... все буферы были просочились. благодаря –

 Смежные вопросы

  • Нет связанных вопросов^_^