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

精贴 置顶
2289 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
随机综合
Java学习总结(1.1.5) 线程通信 03.18
Java学习总结(2.2.2) 责任链模式 04.20
鸿蒙OS代码正式开源 09.11
Java学习总结(2.1.1) TCP/UDP协议 04.17
android 一个Activity跳转到另一个Activity,并数值传递的方法 04.28
情绪巨婴是什么 12.18
Java学习总结(1.1.1) Java程序运行原理分析 03.17
Android开发,为什么Android不直接链接mysql数据库 04.12