Java学习总结(2.2.3) Netty零拷贝机制

精贴 置顶
1920 0
作者:      发布时间: 2020-04-21 09:49:02

Nety自己的Bytebuf

Bytebuf,是为解决 Bytebuffer的问题和满足网络应用程序开发人员的日常需求而设计的。


JDK Bytebuffer的缺点:

无法动态扩容

长度是固定,不能动态扩展和收缩,当数据大于 Bytebuffer容量时,会发生索引越界异常。


API使用复杂

读写的时候需要手工调用fip()和 Rewind()等方法,使用时需要非常谨慎的使用这些api,否则很容出现错误



Bytebuf做了哪些增强

1) API操作便捷性

2) 动态扩容

3) 多种 Bytebuf实现

4) 高效的零拷贝机制



Bytebuf操作

bytebuf:三个重要属性: capacity容量、 readerlndex读取位置、 writerlndex写入位置。

提供了两个指针变量来支持顺序读和写操作,分别是 readerlndex和写操作 writerlndex


常用方法定义:

1) 随机访问索引 getbyte

2) 顺序读read

3) 顺序写write

4) 清除已读内容 discardReadBytes

5) 清除缓冲区 clear

6) 搜索操作

7) 标记和重置

8) 引用计数和释放


下图显示了一个缓冲区是如何被两个指针分割成三个区域的:

discardable bytes

已读可丢弃区域

readable bytes

可读区域

writable bytes

待写区域

0 <= readerIndex <= writerIndes <= capacity


PooledByteBufy对象、内存复用

PoolThreadCache: PooledByteBufAllocator实例维护的一个线程变量。

多种分类的 MemoryRegionCache数组用作内存缓存, Memoryregion Cache内部是链表,队列里面存 Chunk。

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


PooledByteBufallocator. io Buffer运作过程梳理:

1) 创建或复用ByteBuf对象

2) 尝试从对应的缓存,复用内存空间

3) 无缓存时,从内存中申请(unpool)


选择合适的ByteBuf实现


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


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

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


零拷贝机制

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

1、 CompositeBytebuf,将多个Bytebuft合并为一个逻辑上的 ByteBuf,避免了各个 Bytebuf之间的拷贝

2、 wrapedBuffer(方法,将byte数组包装成 ByteBuf对象。

3、sice()方法。将一个ByteBuf对象切分成多个Bytebuf对象。

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







标签:

每日一句

如果花了足够多的时间考虑你的目标,你就能用自己的心看到、摸到、尝到和闻到那个目标,你不会轻易放弃。实现目标的欲望会给你足够的毅力克服哪怕是最令人生畏的障碍。在真的取得成功之前,你应该已经在头脑中达成目标。这样你就能承受任何暂时的痛苦,实现自己的梦想。

标签云

vue
最近综合
情绪巨婴是什么 12.18
普通蛋糕做法 05.31
玉米烤肠芝士面包做法 05.31
Mysql安装教程 - 绿色版 06.18
我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
Typora开发版⽆法使⽤解决⽅法 05.04
为什么无知者越自信? -- 达克效应 05.10
马斯洛需求层次理论 04.29
随机综合
中间件1.2.1-ActiveMQ入门 04.22
玉米烤肠芝士面包做法 05.31
中间件1.2.4-ActiveMQ持久化原理和事务机制 04.29
Java学习总结(2.1.2) BIO阻塞网络编程 04.17
Springboot安装与开始 03.08
Java学习总结(1.1.1) Java程序运行原理分析 03.17
Java学习总结(2.1.1) TCP/UDP协议 04.17
java 固定的范围内,按分辨率比例正确显示图片 04.11