2016-03-04 42 views
1

當我的netty服務器每天有一兩次接收到這個警告,而解碼方法每天處理超過800個數據包。netty 4 LEAK:ByteBuf在被正確釋放前被GC'd

,它似乎並不喜歡的直線是super.decode()線,但我不知道是否是因爲buffer變量(當地的一種)或buf變量(即我收到bytebuf)的。

我在finally塊中添加了release(),但警告仍然存在。

我正在使用netty 4.0.4 final。

WARN ResourceLeakDetector - LEAK: ByteBuf was GC'd before being released correctly. The following stack trace shows where the leaked object was created, rather than where you failed to release it. 
io.netty.util.ResourceLeakException: [email protected] 
    at io.netty.util.ResourceLeakDetector$DefaultResourceLeak.<init>(ResourceLeakDetector.java:174) 
    at io.netty.util.ResourceLeakDetector.open(ResourceLeakDetector.java:116) 
    at io.netty.buffer.UnpooledUnsafeDirectByteBuf.<init>(UnpooledUnsafeDirectByteBuf.java:72) 
    at io.netty.buffer.UnpooledByteBufAllocator.newDirectBuffer(UnpooledByteBufAllocator.java:49) 
    at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:132) 
    at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:123) 
    at io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:60) 
    at io.netty.handler.codec.LengthFieldBasedFrameDecoder.extractFrame(LengthFieldBasedFrameDecoder.java:486) 
    at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:425) 
    at PacketDecoder.decode(PacketDecoder.java:62) 
    at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:351) 
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:231) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:131) 
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:368) 
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:353) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:780) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:100) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:497) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:465) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:359) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) 
    at java.lang.Thread.run(Thread.java:745) 

我的代碼:

@Override 
protected Object decode(ChannelHandlerContext ctx, ByteBuf buf) throws Exception { 
    LOGGER.info(" in the decode handler "); 
    ByteBuf buffer = ((ByteBuf) super.decode(ctx, buf)).order(ByteOrder.BIG_ENDIAN); 
    if (buffer == null) { 
     LOGGER.error(" not all the message is received or a null message "); 
     return null; 
    } 
    try { 

     // reading the buffer until the end 
     // return something other than null  
     } 

    } 
    catch (Exception e){ 
     LOGGER.error(e.getMessage()); 
     e.printStackTrace(); 
     return null; 
    } 
    finally { 
     buffer.retain(); 
     buffer.release(); 
     } 

} 
+0

爲什麼在finally塊中調用'buffer.retain();'? – Ferrybig

+0

因爲readindex在我的try塊的結尾處達到0,所以我認爲我不能直接調用release來糾正我,如果我錯了。謝謝。 – mkachakh

+0

您似乎對'buffer.retain();'的含義感到困惑,這會增加對象的內部引用計數,您只能在特殊情況下使用它。您可能只想在finally塊 – Ferrybig

回答

0

好像你並不總是調用ByteBuf.release()。你應該確保你總是釋放緩衝區。

+0

您的意思是在catch塊中調用ByteBuf.release()嗎?謝謝 – mkachakh