关于Netty ByteBuf 的零拷贝( 三 )
上面的代码是 Netty 的一个例子, 其源码在 netty/example/src/main/java/io/netty/example/file/FileServerHandler.java可以看到, 第一步是通过 RandomAccessFile 打开一个文件, 然后 Netty 使用了 DefaultFileRegion 来封装一个 FileChannel 即:
new DefaultFileRegion(raf.getChannel(), 0, length)当有了 FileRegion 后, 我们就可以直接通过它将文件的内容直接写入 Channel 中, 而不需要像传统的做法: 拷贝文件内容到临时 buffer, 然后再将 buffer 写入 Channel. 通过这样的零拷贝操作, 无疑对传输大文件很有帮助.
关于Netty中使用何种ByteBuf 。
堆内存:特点是内存的分配和回收速度快 , 可以被JVM自动回收;缺点是如果进行Socket的I/O读写 , 需要一次内存复制 , 将堆内存对应的缓冲区复制到内核Channel中 , 性能会有一定程度的下降 。
直接内存:非堆内存 , 它在堆外进行内存分配 , 相比于堆内存 , 它的分配和回收速度会慢一些 , 但是将它写入或者从Socket Channel中读取时 , 由于少了一次内存复制 , 速度比堆内存快 。
到这里 , 在使用netty的时候我们要使用何种的内存呢?
如果是I/O通信 , 我们使用直接内存DirectByteBuf 。
如果是后端业务消息的编解码模块使用的是HeapByteBuf 。
- 预计节省|关于减塑环保必胜客做了件大事 而且还做得挺漂亮
- 双行合一|关于Word我们要了解的知识(12)
- 屏幕|太让人气愤了!关于iPhone12出现的“两大问题”,苹果表明态度!
- 目标和意义进行|关于智能的新思考:我们为什么探索性提出智能三定律?
- 关于边缘计算与网络动态加速
- 深入理解Netty编解码、粘包拆包、心跳机制
- iPhone 12还没发售,关于13的消息已经来了,弥补遗憾
- VAIO 侍 14 体验:关于把笔记本做轻量这件小事
- 企业和用户关于隐私数据博弈的均衡点——自主身份
- 少数派的编辑们又买了这 6 样新玩意
