2017-04-27 95 views
0

我使用ChannelInboundHandlerAdapter類和writeAndFlush來自channelRead()的每條消息;ChannelInboundHandlerAdapter writeAndFlush(msg)方法在刷新後會釋放msg嗎?

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
    ByteBuf msgBuffer = (ByteBuf)msg; 
    BinaryWebSocketFrame frame= new BinaryWebSocketFrame(msgBuffer); 
    ctx.writeAndFlush(frame); 
} 

在這種情況下:Netty是否釋放「frame」和「msg」。我知道他們是引用計數的對象,因此當我嘗試手動釋放他們像下面這樣:

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
    ByteBuf buf = (ByteBuf)msg; 
    BinaryWebSocketFrame frame= new BinaryWebSocketFrame(buf); 
    ctx.writeAndFlush(frame); 
    buf.release(); 
    frame.release(); 
} 

但在這種情況下,我得到引用計數對象釋放錯誤,如下:

io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1 

起初,我靠網狀它釋放的相關情況,但它給了我的內存泄漏錯誤運行時偶爾。

如何減少這樣的情況下,內存使用,因爲在每一個channelRead事件創建新實例是不是當你不能正確地釋放他們好主意。

回答

1

是啊,如果你打電話writeAndFlush(...)你基本上是傳輸緩衝區的所有權。 Netty本身會釋放緩衝區(如果寫入的話)或寫入失敗。

+0

BinaryWebSocketFrame實例呢?它也發佈了嗎?或者我應該明確地發佈它? –

+0

實現了ReferenceCounted的所有內容都將被髮布 –

相關問題