零拷贝是中间件相关面试中必考题,本文就和大家一起来总结一下NIO拷贝的原理,并结合Netty代码,从代码实现层面近距离观摩如何使用java实现零拷贝。
**“零拷贝”**其实包括两个层面的含义:
在IO编程领域,当然是拷贝的次数越少越好,逐步优化,将其拷贝次数将为0,最大化的提高性能。
那接下来我们循序渐进来看一下如何减少数据复制。
接下来我们将以RocketMQ消息发送、消息读取场景来阐述IO读写过程中可能需要进行的数据复制与上下文切换。
一次传统的IO读序列流程如下所示:
java应用中,如果要将从文件中读取数据,其基本的流程如下所示:
是否调用了FileChannel的transferTo方法。
温馨提示:本文并没有打算详细分析Epoll机制以及编程实践。
从Netty的实现中我们基本可以得出结论:是否是零拷贝,判断的依据是是否调用了FileChannel的transferTo方法,更准备的表述是底层是否调用了操作系统的sendfile函数,并且操作系统底层还需要支持gather机制,即linux的内核版本不低于2.4。