netty源码分析(六) - ByteBuf - 2UnpooledByteBufAllocator

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty源码分析(六) - ByteBuf - 2UnpooledByteBufAllocator相关的知识,希望对你有一定的参考价值。

参考技术A

先来看成员变量:

再看构造方法(方便查看进行了手动内联):

很简单就是在堆内创建一个数组作为字节容器,设置readIndex/writeIndex为0

再看下重写的_setxxx/_getxxx,以int为例

同样很简单,就是数组操作

再看下设置容量方法

还是很简单就是创建新数组,然后copy,然后free原数组

看下常用方法

先来看成员变量:

再看构造方法(方便查看进行了手动内联):

再看下重写的_setxxx/_getxxx,以int为例

再看下设置容量方法

就是创建新的NIO ByteBuffer把原ByteBuffer中字节copy过来,然后需要注意下 setByteBuffer(newBuffer, true); ,tryFree为true会释放原ByteBuf

memoryAddress为分配的ByteBuffer首地址

常用方法

至此UnpooledByteBufAllocator分析完毕,PooledByteBufAllocator留到下一节吧

Netty-源码分析ByteBuf-readSlice和readRetainedSlice使用细节

返回从当前readerIndex开始的此缓冲区的子区域的新分片,并将readerIndex增加新分片的大小(=长度)。
另请注意,此方法将不会调用retain(),因此不会增加引用计数。

 

跟slice极为相似,只是把原始缓冲区的readerIndex进行了增加

@Override
    public ByteBuf readSlice(int length) 
        checkReadableBytes(length);
        ByteBuf slice = slice(readerIndex, length);
        readerIndex += length;
        return slice;
    
public static void main(String[] args) throws Exception 
		ByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
		ByteBuf original = allocator.directBuffer(32);
		original.writeByte(1);
		original.writeByte(2);
		original.writeByte(3);
		original.writeByte(4);

		//分配子缓冲区
		ByteBuf sub = original.readSlice(3);

		//原始缓冲区readerIndex=3, readableBytes=1
		System.out.println("org.readerIndex = " + original.readerIndex());
		System.out.println("org.readableBytes = " + original.readableBytes());

		//原始缓冲区引用计数器不变refCnt=1
		System.out.println("org.refCnt=" + original.refCnt());
		//释放一次
		original.release();

 


	public static void main(String[] args) throws Exception 
		ByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
		ByteBuf original = allocator.directBuffer(32);
		original.writeByte(1);
		original.writeByte(2);
		original.writeByte(3);
		original.writeByte(4);

		//分配子缓冲区
		ByteBuf sub = original.readRetainedSlice(3);

		//原始缓冲区readerIndex=3, readableBytes=1
		System.out.println("org.readerIndex = " + original.readerIndex());
		System.out.println("org.readableBytes = " + original.readableBytes());

		//原始缓冲区引用计数器改变refCnt=2
		System.out.println("org.refCnt=" + original.refCnt());
		//释放一次
		original.release();

		//子缓冲区再释放一次
		sub.release();
		System.out.println("org.refCnt=" + original.refCnt());

QQ群:212320390

以上是关于netty源码分析(六) - ByteBuf - 2UnpooledByteBufAllocator的主要内容,如果未能解决你的问题,请参考以下文章

8. Netty源码分析之ByteBuf

[Netty源码分析]ByteBuf(一)

Netty-源码分析ByteBuf-slice和retainedSlice使用细节

Netty4.XNetty源码分析之ByteBuf

Netty源码分析-MessageToByteEncoder

Netty-源码分析ByteBuf-readSlice和readRetainedSlice使用细节