首页 > Web开发 > 详细

NIO学习笔记,从Linux IO演化模型到Netty—— Netty零拷贝

时间:2020-02-25 16:22:18      阅读:52      评论:0      收藏:0      [点我收藏+]

Netty的中零拷贝与上述零拷贝是不一样的,它并不是系统层面上的零拷贝,只是相对于ByteBuf而言的,更多的是偏向于数据操作优化这样的概念。

Netty中的零拷贝:

1.CompositeByteBuf,将多个ByteBuf合并为一个逻辑上的ByteBuf,避免了各个ByteBuf之间的拷贝。

使用方式:

CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer(); 
compositeByteBuf.addComponents(true, ByteBuf1, ByteBuf1); 

注意: addComponents***个参数必须为true,那么writeIndex才不为0,才能从compositeByteBuf中读到数据。

 

2.wrapedBuffer()方法,将byte[]数组包装成ByteBuf对象。

byte[] bytes = data.getBytes();ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes); 

Unpooled.wrappedBuffer(bytes)就是进行了byte[]数组的包装工作,过程中不存在内存拷贝。

即包装出来的ByteBuf和byte[]数组指向了同一个存储空间。因为值引用,所以bytes修改也会影响 byteBuf 的值。

 

3.ByteBuf的分割,slice()方法。将一个ByteBuf对象切分成多个ByteBuf对象。

ByteBuf directByteBuf = ByteBufAllocator.DEFAULT.directBuffer(1024);ByteBuf header = directByteBuf.slice(0,50);ByteBuf body = directByteBuf.slice(51,1024); 

header和body两个ByteBuf对象实际上还是指向directByteBuf的存储空间。

NIO学习笔记,从Linux IO演化模型到Netty—— Netty零拷贝

原文:https://www.cnblogs.com/AllenDuke/p/12362262.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!