1.前言

前面我们谈到了Java NIO的众多技术脉络。下面我们来说一下Java NIO的技术核心:零拷贝技术,Kafka就是采用Java NIO零拷贝技术提升文件读取性能。

2. JavaNIO中的零拷贝

2.1 NIO中内存映射方式I/O

首先要说明的是,JavaNIO中的Channel(通道)就相当于操作系统中的内核缓冲区,有可能是读缓冲区,也有可能是网络缓冲区,而Buffer就相当于操作系统中的用户空间缓冲区。

File file = new File("test.zip");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileChannel fileChannel = raf.getChannel();
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());

NIO中的FileChannel.map()方法其实就是采用了操作系统中的内存映射方式,将内核缓冲区的内存和用户缓冲区的内存做了一个地址映射。它解决数据从磁盘读取到内核缓冲区,然后内核缓冲区的数据复制移动到用户空间缓冲区。程序还是需要从用户态切换到内核态,然后再进行操作系统调用,并且数据移动和复制了两次。

这种方式适合读取大文件,同时也能对文件内容进行更改,但是如果其后要通过SocketChannel发送,还是需要CPU进行数据的拷贝。

processData();
// 数据处理完成以后,打卡一个SocketChannel
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("", 1234));
// 这时依旧需要CPU将内核缓冲区的内容拷贝到网络缓冲区
socketChannel.write(buffer);

2.2 NIO中的零拷贝

File file = new File("test.zip");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileChannel fileChannel = raf.getChannel();
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("", 1234));
// 直接使用了transferTo()进行通道间的数据传输
fileChannel.transferTo(0, fileChannel.size(), socketChannel);

这种方式就是NIO中的零拷贝,我们来分析一下其中原理:

  1. transferTo()方法直接将当前通道内容传输到另一个通道,没有涉及到Buffer的任何操作,NIO中的Buffer是JVM堆或者堆外内存,但不论如何他们都是操作系统内核空间的内存。也就是说这种方式不会有内核缓冲区到用户缓冲区的读写问题。
  2. transferTo()的实现方式就是通过系统调用sendfile()(当然这是Linux中的系统调用),根据我们上面所写说这个过程是效率远高于从内核缓冲区到用户缓冲区的读写的。

同理transferFrom()也是这种实现方式。

NIO详解(十):FileChannel零拷贝技术相关推荐

  1. 元宇宙技术普及读本重磅问世 详解十大技术 把脉数字经济 前瞻产业布局

    转自 元宇宙共识圈 王恩东.倪光南.沈昌祥.郑纬民--四位中国工程院院士联袂力荐 倪健中.姚前.李正茂.朱嘉明.肖风.敖然等权威专家一致推荐 汇聚元宇宙技术专家及产业一线佼佼者倾力撰写 元宇宙技术普及 ...

  2. Java 两种zero-copy零拷贝技术mmap和sendfile的介绍

    详细介绍了两种zero-copy零拷贝技术mmap和sendfile的概念和基本原理. 文章目录 1 标准IO 2 零拷贝 2.1 sendfile调用 2.1 mmap调用 2.2 MQ中的应用 1 ...

  3. 零拷贝技术( DMA、PageCache)

    文章目录 DMA 传统I/O 利用DMA的IO 零拷贝 mmap + write mmap详解 sendfile 真正的零拷贝 为什么需要内核缓存区? 大文件传输:异步IO+直接IO 总结 DMA 直 ...

  4. 【290期】关于零拷贝技术,你了解多少?常见典型案例?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 注意事项: ...

  5. 从根上理解高性能、高并发(二):深入操作系统,理解I/O与零拷贝技术

    1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早就了然与胸,什么线程池.零拷贝.多路复用.事件驱动.epoll等等名词信手拈来,又或许你对具有这些技术特 ...

  6. 计算机IO系列「一」零拷贝技术

    深入剖析Linux IO原理和几种零拷贝机制的实现 转载自:深入剖析Linux IO原理和几种零拷贝机制的实现 - 知乎 前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将 ...

  7. Java基础——Java NIO详解(一)

    一.基本概念 1.I/0简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过str ...

  8. 零拷贝技术在 Java 中为何这么牛?

    [CSDN 编者按]大家在学计算机的过程中是否会遇到"零拷贝"这样的字眼,本文针对这一技术为大家提供详细的概念解释,并对其产出的意义及其在Java中的应用进行说明. 责编 | 欧阳 ...

  9. 什么是零拷贝技术(Zero Copy)?

    千里之行,始于足下 什么是"零拷贝"技术 要想要了解"零拷贝"机制,首先要了解在什么地方会用到这个东西.试想一个场景:我们需要从磁盘读取一个文件,然后通过网络输 ...

最新文章

  1. 【动画2】CALayer动画
  2. 密码统计分析工具pipal
  3. python提取txt中指定内容_提取视频中的音频——python三行程序搞定!
  4. Oracle 中UNDO与REDO的差别具体解释
  5. 捐款捐物捐技术,14 家科技巨头抗疫在行动!
  6. 【Oracle】-【LRU和DBWR】-LRU算法与DBWR中的应用
  7. 关于c# 静态构造函数的说明
  8. java三大特性(封装、继承、多态)
  9. Git操作的基本命令
  10. Lintcode 尾部的0
  11. think PHP前台模板,thinkphp5(二)前台模板的引入
  12. AI产品经理,如何面对数据挖掘?
  13. 数据表多次更新插入重复数据去重SQL
  14. 电脑开的热定手机连不上解决方法
  15. CSMA/CD 简要介绍
  16. php k线公式源码,K线动能(附图,贴图 ,源码)
  17. OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  18. 机器学习 卷积神经网络 Convolutional Neural Network(CNN)
  19. Linux后SVN拒绝访问,SVN无法提交出现 Can't set file /db/txn_current read-write :拒绝访问...
  20. 金蝶开发 破解数据中心用户密码

热门文章

  1. 设计模式之【抽象工厂模式】
  2. angularjs loading, animate
  3. Linux链接库二(动态库,静态库,库命名规则,建立个没有版本号的软连接文件)...
  4. java概述与基础知识
  5. FusionCharts Free(3)
  6. 哈佛研究人员开发基于折纸造型高精度微型手术机器人
  7. 人工智能突破!牛津大学的科学家用机器合成了“类人类思想”
  8. python中的序列总结:列表,元组,字符串
  9. token、cookie是什么
  10. java根据日期判断星座_根据日期计算星座