关于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 。