Java学习总结(2.2.3) Netty零拷贝机制
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堆内 | unpool | safe | UnpooledHeapByteBuf | 数组实现 |
unsafe | UnpooledUnsafeHeapByterBuf | Unsafe类直接操作内存 | ||
pool | safe | PooledHeapByteBuf | ||
unsafe | PooledUnsafeHeapByteBuf | |||
direct堆外 | unpool | safe | UnpooledDirectByteBuf | NIO DirectByteBuffer |
unsafe | UnpooledUnsafeDirectByteBuf | |||
pool | safe | PooledDirectByteBuf | ||
unsafe | PooledUnsafeDirectByteBuf | 默认 |
在使用中,都是通过 Bytebufallocators分配器进行申请,同时分配器具备有内存管理的功能
零拷贝机制
Netty的零拷贝机制,是一种应用层的实现。和底层JVM、操作系统内存机制并无过多关联。
1、 CompositeBytebuf,将多个Bytebuft合并为一个逻辑上的 ByteBuf,避免了各个 Bytebuf之间的拷贝
2、 wrapedBuffer(方法,将byte数组包装成 ByteBuf对象。
3、sice()方法。将一个ByteBuf对象切分成多个Bytebuf对象。
使用Bytebuf是Netty高性能很重要的一个原因!
- 上一篇: Java学习总结(2.2.2) 责任链模式
- 下一篇:
每日一句
博客分组
标签云
- 最近综合
- 情绪巨婴是什么 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