ChannelHandlerContext调用writeAndFlush()方法时,当消息发送完成,Netty框架会主动帮助应用释放内存,内存的释放分为两种场景。
- 堆内存(PooledHeapByteBuf)
会将HeapByteBuffer转换成DirectByteBuffer,并释放PooledHeapByteBuf到内存池。
//AbstractNioChannel
protected final ByteBuf newDirectBuffer(ByteBuf buf){
final int readableBytes = buf.readableBytes();
if (readableBytes == 0){
ReferenceCountUtil.safeRelease(buf);
return Upooled.EMPTY_BUFFER;
}
final ByteBufAllocator alloc = alloc();
if(alloc.isDirectBufferedPooled()){
ByteBuf directBuf = alloc.directBuffer(readableBytes);
directBuf.writeBytes(buf, buf.readerIndex(), readableBytes);
ReferenceCountUtil.safeRelease(buf);
return directBuf;
}
}
如果消息完整地被写到SocketChannel中,则释放DirectByteBuf
//ChannelOutboundBuffer
public boolean remove(){
Entry e = flushEntry();
if(e == null){
clearNioBuffers();
return false;
}
Object msg = e.msg;
ChannelPromise promise = e.promise;
int size = e.pendingSize;
removeEntry(e);
if(!e.cancelled){
ReferenceCountUtil.saveRelease(msg);
safeSuccess(promise);
decrementPendingOutboundBytes(size, false, true);
}
}
- DirectByteBuffer