newDirectBuffer中两种direct化bytebuf的区别
来源:9-4 写buffer队列

慕勒4339842
2019-11-24
老师在【9-4 写buffer队列】小节讲direct化bytebuf的时候,讲了newDirectBuffer中有两种方法。能解释一下这两种方法的区别吗,以及为什么在此处需要用这两种方法呢?
protected final ByteBuf newDirectBuffer(ReferenceCounted holder, ByteBuf buf) {
final int readableBytes = buf.readableBytes();
if (readableBytes == 0) {
ReferenceCountUtil.safeRelease(holder);
return Unpooled.EMPTY_BUFFER;
}
// 第一种方法
final ByteBufAllocator alloc = alloc();
if (alloc.isDirectBufferPooled()) {
ByteBuf directBuf = alloc.directBuffer(readableBytes);
directBuf.writeBytes(buf, buf.readerIndex(), readableBytes);
ReferenceCountUtil.safeRelease(holder);
return directBuf;
}
// 第二种方法
final ByteBuf directBuf = ByteBufUtil.threadLocalDirectBuffer();
if (directBuf != null) {
directBuf.writeBytes(buf, buf.readerIndex(), readableBytes);
ReferenceCountUtil.safeRelease(holder);
return directBuf;
}
// Allocating and deallocating an unpooled direct buffer is very expensive; give up.
if (holder != buf) {
// Ensure to call holder.release() to give the holder a chance to release other resources than its content.
buf.retain();
ReferenceCountUtil.safeRelease(holder);
}
return buf;
}
写回答
1回答
-
闪电侠
2019-11-25
第一种是通过池化的内存分配器去分配内存,第二种是 threadLocal 级别的 ByteBuf 缓存,不走 pool 逻辑,底层是通过对象池来实现的,相当于也是做了一层优化
00
相似问题