2016-03-04 1 views
1

Je reçois cet avertissement avec mon serveur netty une ou deux fois par jour tandis que les méthodes de décodage traite plus de 800 paquets/jour.netty 4 FUITE: ByteBuf a été GC'd avant d'être publié correctement

La ligne qu'il ne semble pas que la ligne est super.decode() mais je ne suis pas sûr que ce soit à cause de la variable buffer (le local) ou la variable buf (le bytebuf que je reçois).

J'ai ajouté le release() dans le bloc finally mais l'avertissement est toujours là. Je suis en train d'utiliser la finale de Netty 4.0.4.

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) 

Mon code:

@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

Pourquoi appelez-vous 'buffer.retain();' dans le bloc finally? – Ferrybig

+0

Parce que le readindex atteint 0 à la fin de mon essai bloc donc je pensais que je ne peux pas appeler la version directement me corriger si je me trompe. Je vous remercie. – mkachakh

+0

Vous semblez être confus ce que la signification de 'buffer.retain();', cela augmente le nombre de références internes de l'objet, vous ne l'utilisez que dans des circonstances spéciales. Vous vouliez probablement seulement appeler 'buffer.release()' dans le bloc final – Ferrybig

Répondre

0

Il semble que vous appelez pas toujours ByteBuf.release(). Vous devriez vous assurer de toujours libérer des tampons.

+0

Vous voulez aussi appeler ByteBuf.release() dans le bloc catch? Je vous remercie – mkachakh