나는 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-the-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