java netty kafka rocketMQ 零拷贝 ? 什么是零拷贝

https://zhuanlan.zhihu.com/p/64737522——JVM 与 Linux 的内存关系详解——关于jdk NIO部分用内核内存 的讲解 是错的

 

 

netty零拷贝——《Netty权威指南》22.2.6

文件IO操作分类

1、普通IO

2、Filechannel

3、MapperByteBuffer

4、DirectByteBuffer

https://www.ibm.com/developerworks/library/j-nativememory-linux/index.html——Understanding how the JVM uses native memory on Windows and Linux

http://moheqionglin.com/site/serialize/02008003/detail.html——深入剖析java零拷贝

https://zhuanlan.zhihu.com/p/35277219——什么是pageCache

http://www.jiangxinlingdu.com/thought/2018/11/28/io.html——文件读写IO分类

FileChannle和不同IO读写的区别

FileChannel 存在于 java.nio 包中,属于 NIO 的一种,但是注意 NIO 并不一定意味着非阻塞,这里的 FileChannel 就是阻塞的。那么这种新IO较与传统的IO有哪些优势呢?

其实这么说不够严谨,因为你必须用对了FileChannle,不然不存在优势之说。如何用对,就需要先从FileChannle的特点入手,FileChannel 采用了 ByteBuffer 这样的内存缓冲区,让我们可以非常精准的控制写盘的大小,这是普通 IO 无法实现的。

简单来说,传统的IO写数据时,先是往pagecache写入数据,不会马上刷到磁盘,而是将 pagecache 对应的位置标记为脏页,然后内核程序会定时将脏页的数据统一刷到磁盘中,但是为了安全起见,如果突然断电了pagecache中的数据就会丢失,所以这个定时的时间还不能太长,但我们希望的是,每次刷盘的尽可能在脏页比较多的情况下,不然对磁盘的写入效率太低

而 FileChannel 将ByteBuffer 中的数据也不会马上写入到磁盘中,也是先写到pagecache,但是FileChannel 可以控制写盘的大小,它当然会尽可能写满一块数据块,然后再调用 force() 方法,用于通知操作系统进行及时的刷盘

kafka rocketmq 都有用 MMAP 请查阅对应PDF文件

你可能感兴趣的:(java netty kafka rocketMQ 零拷贝 ? 什么是零拷贝)