Components 用来保存的就是所有接收到的 Buffer,Indices 记录每个 buffer 的起始位置,lastAccessedComponentId 记录上一次访问的 ComponentId 。
CompositeChannelBuffer 并不会开辟新的内存并直接复制所有 ChannelBuffer 内容,而是直接保存了所有 ChannelBuffer 的引用,并在子 ChannelBuffer 里进行读写,实现了零拷贝 。
其他零拷贝RocketMQ 的消息采用顺序写到 commitlog 文件,然后利用 consume queue 文件作为索引 。
RocketMQ 采用零拷贝 mmap+write 的方式来回应 Consumer 的请求 。
同样 Kafka 中存在大量的网络数据持久化到磁盘和磁盘文件通过网络发送的过程,Kafka使用了 Sendfile 零拷贝方式 。
总结零拷贝如果简单用 Java 里面对象的概率来理解的话,其实就是使用的都是对象的引用,每个引用对象的地方对其改变就都能改变此对象,永远只存在一份对象 。
推荐阅读
- 总结的非常详细 深入理解linux系统的目录结构
- 健走有啥好处
- 深入浅出微服务架构:一分钟让你轻松上手Docker容器
- 吃透移动端 H5 响应式布局 |深入原理到目前最佳实践方案
- 心理探秘:如何辨别不自信的男人?
- 中国茶营销,茶企需深入领会中国茶道本真
- 8分钟带你深入浅出搞懂Nginx
- 三星堆为何不敢深入研究? 三星堆研究不再公布
- 普洱茶之发源地探秘
- 黔台茶文化交流座谈会 两岸业者深入交流
