文章插图
图2-11 文件传输 “零拷贝”
对于很多操作系统它直接将文件缓冲区的内容发送到目标Channel中,而不需要通过拷贝的方式,这是一种更加高效的传输方式,它实现了文件传输的“零拷贝” 。
2.2.3. 内存池
随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作 。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作 。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制 。下面我们一起看下Netty ByteBuf的实现:

文章插图
图2-12 内存池ByteBuf
Netty提供了多种内存管理策略,通过在启动辅助类中配置相关参数,可以实现差异化的定制 。
下面通过性能测试,我们看下基于内存池循环利用的ByteBuf和普通ByteBuf的性能差异 。
用例一,使用内存池分配器创建直接内存缓冲区:

文章插图
图2-13 基于内存池的非堆内存缓冲区测试用例
用例二,使用非堆内存分配器创建的直接内存缓冲区:

文章插图
图2-14 基于非内存池创建的非堆内存缓冲区测试用例
各执行300万次,性能对比结果如下所示:

文章插图
图2-15 内存池和非内存池缓冲区写入性能对比
性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关) 。
下面我们一起简单分析下Netty内存池的内存分配:

文章插图
图2-16 AbstractByteBufAllocator的缓冲区分配
继续看newDirectBuffer方法,我们发现它是一个抽象方法,由AbstractByteBufAllocator的子类负责具体实现,代码如下:

文章插图
图2-17 newDirectBuffer的不同实现
代码跳转到PooledByteBufAllocator的newDirectBuffer方法,从Cache中获取内存区域PoolArena,调用它的allocate方法进行内存分配:

文章插图
图2-18 PooledByteBufAllocator的内存分配
PoolArena的allocate方法如下:

文章插图
图2-18 PoolArena的缓冲区分配
我们重点分析newByteBuf的实现,它同样是个抽象方法,由子类DirectArena和HeapArena来实现不同类型的缓冲区分配,由于测试用例使用的是堆外内存,

文章插图
图2-19 PoolArena的newByteBuf抽象方法
因此重点分析DirectArena的实现:如果没有开启使用sun的unsafe,则

文章插图
图2-20 DirectArena的newByteBuf方法实现
执行PooledDirectByteBuf的newInstance方法,代码如下:

文章插图
图2-21 PooledDirectByteBuf的newInstance方法实现
通过RECYCLER的get方法循环使用ByteBuf对象,如果是非内存池实现,则直接创建一个新的ByteBuf对象 。从缓冲池中获取ByteBuf之后,调用AbstractReferenceCountedByteBuf的setRefCnt方法设置引用计数器,用于对象的引用计数和内存回收(类似JVM垃圾回收机制) 。
2.2.4. 高效的Reactor线程模型
常用的Reactor线程模型有三种,分别如下:
1) Reactor单线程模型;
2) Reactor多线程模型;
3) 主从Reactor多线程模型
Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下:
1) 作为NIO服务端,接收客户端的TCP连接;
2) 作为NIO客户端,向服务端发起TCP连接;
3) 读取通信对端的请求或者应答消息;
4) 向通信对端发送消息请求或者应答消息 。
Reactor单线程模型示意图如下所示:

文章插图
图2-22 Reactor单线程模型
由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作 。从架构层面看,一个NIO线程确实可以完成其承担的职责 。例如,通过Acceptor接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码 。用户Handler可以通过NIO线程将消息发送给客户端 。
推荐阅读
- 计算机病毒与木马的区别
- Java语言如何给main方法传递参数?看完秒懂
- 主动攻击与被动攻击和安全计算
- 孕妇鱼肝油的好处与过量的危害
- |夜读|我与郑先生
- 浅谈中国古今名人与茶文化
- 二 竹茹酒的功效与作用
- 一 猪胰酒的功效与作用
- 一 竹茹酒的功效与作用
- 二 竹叶酒的功效与作用
