Netty零拷贝机制

  1. ByteBuf
  2. PooledByteBuf对象、内存复用
  3. 零拷贝机制

1 ByteBuf

  1. ByteBuf操作
  2. ByteBuf动态扩容
  3. 选择合适的ByteBuf实现
1.1 ByteBuf操作

ByteBuf三个重要属性:capacity容量、readerIndex读取位置、writerIndex写入位置。提供了两个指针变量来支持顺序读和写操作,分别是读操作readerIndex和写操作writerIndex。

常用方法定义
随机访问索引 getByte
顺序读 read*
顺序写 write*
清除已读内容 discardReadBytes
清除缓冲区 clear
搜索操作
标记和重置
引用计数和释放

下图显示一个缓冲区是如何被两个指针分割成三个区域的:
在这里插入图片描述

1.2 ByteBuf动态扩容

capacity默认值:256字节、最大值:Integer.MAX_VALUE(2GB)

write*方法调用时,通过AbstractByteBuf.ensureWritable0进行检查。容量计算方法:AbstractByteBufAllocator.calculateNewCapacity(新capacity的最小要求,capacity最大值)

根据新capacity的最小值要求,对应有两套计算方法:

没超过4兆:从64字节开始,每次增加一倍,直至计算出来的newCapacity满足新容量最小要求。
示例:当前大小256,已写250,继续写10字节数据,需要的容量最小要求是261,则新容量是6422*2=512

超过4兆:新容量 = 新容量最小要求 / 4兆 * 4兆 + 4兆
示例:当前大小3兆,已写3兆,继续写2兆数据,需要的容量最小要求是5兆,则新容量是8兆(不能超过最大值)

1.3 选择合适的ByteBuf实现

了解核心的:3个维度的划分方式,8种具体实现

堆内/堆外是否池化访问方式具体实现类备注
heap堆内unpoolsafeUnpooledHeapByteBuf数组实现
unsafeUnpooledUnsafeHeapByteBufUnsafe类直接操作内存
poolsafePooledHeapByteBuf
unsafePooledUnsafeHeapByteBuf
direct堆外unpoolsafeUnpooledDirectByteBufNIO DirectByteBuffer
unsafeUnpooledUnsafeDirectByteBuf
poolsafePooledDirectByteBuf
unsafePooledUnsafeDirectByteBuf

在使用中,都是通过ByteBufAllocator分配器进行申请的,同时分配器具备有内存管理的功能

2 PooledByteBuf对象、内存复用

PoolThreadCache:PooledByteBufAllocator实例维护的一个线程变量。
多种分类的MemoryRegionCache数组用作内存缓存,MemoryRegionCache内部是链表,队列里面存Chunk。

PoolChunk里面维护了内存引用,内存复用的做法就是把buf的memory指向chunk的memory。

PooledByteBufAllocator.ioBuffer运作过程梳理:
在这里插入图片描述

3 零拷贝机制

Netty的零拷贝机制,是一种应用层的实现。和底层JVM、操作系统内存机制并无过多关联。

  1. CompositeByteBuf,将多个ByteBuf合并为一个逻辑上的ByteBuf,避免了各个ByteBuf之间的拷贝
CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer();
ByteBuf newBuffer = compositeByteBuf.addComponents(true, buffer1, buffer2);
  1. wrapedBuffer()方法,将byte[]数组包装成ByteBuf对象。
ByteBuf newBuffer = Unpooled.wrappedBuffer(new byte[]{1,2,3,4,5});
  1. slice()方法,将一个ByteBuf对象切分成多个ByteBuf对象
ByteBuf buffer1 = Unpooled.wrappedBuffer("hello".getBytes());
ByteBuf newBuffer = buffer1.slice(1, 2);

使用ByteBuf是Netty高性能很重要的一个原因!

参考文章

网易云课堂《Java高级开发工程师》

结语

本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值