Netty中的ByteBuf

提供的三种缓冲区类型

1 heap buffer(堆缓冲区)

在JVM堆上分配的缓冲区,底层通过byte array来存放实际数据;
日常开发用的最多。

优点:由于数据是存储在JVM的堆中,因此可以快速的创建与快速的释放,并且它提供了直接访问内部字节数组的方法。
缺点:每次读写数据时,都需要先将数据复制到直接缓冲区中再进行网络传输。

2 direct buffer(直接缓冲区)

在堆外直接分配内存空间,直接缓冲区不会占用堆的容量空间,因为它是由操作系统在本地内存进行的数据分配。

优点:在使用socket进行数据传递时,性能非常好,因为数据直接位于操作系统的本地内存中不需要从JVM将数据复制到直接缓冲区中,性能很好。
缺点:因为Dierct buffer是直接在操作系统的内存中的,所以内存空间的分配和释放要比堆空间更加复杂,而且速度更慢一些。
Netty通过提供内存池来解决这个问题。直接缓冲区并不支持通过字节数组的方式来访问数据。

重点:对于后端的业务消息的编解码来说,推荐使用HeapByteBuf;对于I/O通信线程在读写缓冲区时推荐使用DirectByteBuf。

3 composite buffer(复合缓冲区)

复合缓冲区。容器类型
相当于容器,里面可以存heap buffer和direct buffer。
下面为composite buffer的例子


import java.util.Iterator;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;

public class ByteBufTest2 {
	public static void main(String[] args) {
		CompositeByteBuf buf = Unpooled.compositeBuffer();
	
		ByteBuf heapBuf = Unpooled.buffer(10);
		ByteBuf directBuf = Unpooled.directBuffer(10);
	
		buf.addComponents(heapBuf,directBuf);
		buf.removeComponent(0);
		
		Iterator<ByteBuf> iter = buf.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
		
		buf.forEach(System.out::println);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值