零拷贝
ByteBuf 可以直接使用直接内存。
Socket 通信如果采用堆内存的话,需要将堆里的对象拷贝到堆外,进行一次对象拷贝。
原因是因为堆里面的对象可能会随着垃圾回收改变对象地址,所以对该对象的引用更新地址。
但是 Socket 没有更新对象地址动作,需要的是一个固定的地址。所以堆内存不适合 Socket 使用。只能将对象拷贝到直接内存然后使用。
而 ByteBuf 直接使用直接内存,减少了对象拷贝。
Netty 提供了组合 Buffer,可以将多个 Buffer 合并为一个。
传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer。
而 Netty 无需内存拷贝就可以聚合 Buffer。
Netty 的文件传输采用transferTo,直接发给 Channel,避免进行内存拷贝。