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 逻辑,底层是通过对象池来实现的,相当于也是做了一层优化

0
0

Java读源码之Netty深入剖析

解析netty各大组件细节,百万级性能调优,设计模式实际运用

2334 学习 · 283 问题

查看课程