私はHTTPリクエスト/レスポンスを処理するためにNettyを使用しています。そして、パイプラインにダウンし、次のByteBuf書き込み:ログで公開リソースを理解する
public class MyBusinessLogic
extends ChannelInboundHandlerAdapter{
public void channelRead(ChannelHandlerContext ctx, Object msg){
ByteBuf bb = ctx.alloc().buffer().writeBytes(//some bytes)
ctx.writeAndFlush(bb, ctx.newPromise())
//I did not release bb here
}
}
を私は持って警告いくつかの類似したに「ByteBuf was garbage collected before it was released
」...それに似たもの。
なぜ私たちは自分でByteBuf
をリリースする必要がありますか?彼らはとにかくゴミ収集されています。 bb
をここに公開しないと、私はどのような悪いトラブルに遭遇できますか?
チャンネルの将来のリスナーとしてリリースするバッファを追加するだけですか?
ByteBuf bb = //
ctx.writeAndFlush(response, ctx.newPromise())
.addListener(new ChannelFutureListener(){
public void operationComplete(ChannelFuture f){
buf.release()
}
});
関連:https://stackoverflow.com/questions/46326821/severe-leak-bytebuf-release-was-not-called-before-its-garbage-collected-ne https://stackoverflow.com/questions/ 29805270/leak-bytebuf-release-was-before-its-its-garbage-collected-springと呼ばれていました。たぶんこれは:https://logz.io/blog/netty-bytebuf-memory-leak/(私のサイトではなく、ちょうどGoogleの結果から) –
@RCを読む価値があります。私はちょうど答えを見た。私はもう少し詳しく興味深いです。とにかく 'ByteBuf'がガベージコレクションされている場合、何がメモリリークを引き起こす可能性がありますか? –
すべてのByteBufsの1%だけがリーク検出機能を有効にしているので、メモリの99%がデフォルトでリークします:http://netty.io/wiki/reference-counted-objects.html#leak-detection-levels – Ferrybig