一,使用直接内存的意义:
使用直接内存,可以避免用户态的数据拷贝,举例,比如我们在netty中通过
ByteBuf directBuffer = allocator.directBuffer();
创建的bytebuf是基于直接内存的,我们往其中写入数据,只需要通过用户态堆内存往内核直接内存复制一次即可,通过channel写数据都是直接通过直接内存读取到socket缓冲区,实例如下
ByteBuf directBuffer = allocator.directBuffer();
directBuffer.writeBytes("Hello, World!".getBytes());
// 或者传递给Netty的I/O操作,由Netty自动释放
ChannelHandlerContext ctx; // 获取到ChannelHandlerContext对象
ctx.writeAndFlush(directBuffer);
而如果使用堆内存的话,需要先在用户态堆内存拷贝一次,当需要channel写数据的时候又要,通过用户态往socket缓冲区拷贝一次,说到这里大家该说了,使用直接内存不是也是复制了两次嘛,这有什么区别,其实区别还是很大的,上边的拷贝是内核之间的拷贝