netty学习笔记2--ByteBuf类结构

在前面做项目的时候一直比较疑惑ByteBuf的创建是怎么一回事,因为比较忙也就胡乱的找了一个可以创建ByteBuf的方法进行使用了,今天在这里来总结一下吧。

首先,ByteBuf的类继承关系图,见附件netty类继承关系图。

从内存分配的角度看,ByteBuf可以分为两类:

(1)堆内存(HeapByteBuf)字节缓冲区:特点是内存的分配和回收速度快,可以被JVM自动回收;缺点就是如果进行socket的i/o读写需要额外做一次内存复制,将堆内存对应的缓冲区复制到内核Channel中,性能会有一定程度的下降。

(2)直接内存(DirectByteBuf)字节缓冲区:特点是非堆内存,它在堆外进行内存分配,相对于堆内存,它的分配和回收速度相对慢一些,但是将它写入或者从Socket Channel中读取时,会少一次内存复制,速度比堆内存快一些。

经验表明,ByteBuf的最佳实践是:在I/O通信线程中的读写缓冲区使用DirectByteBuf,后端业务消息的编解码模块使用HeapByteBuf的方式。

从内存回收角度看,ByteBuf也分为两类:基于对象池的ByteBuf和普通的ByteBuf。两者的主要区别在于基于对象池的ByteBuf可用重用ByteBuf对象,它自己维护了一个内存池,可以循环利用创建的ByteBuf,提升内存的使用效率,降低由于高负载导致的频繁GC。因此在高负载,大并发的情况下建议使用对象池ByteBuf。

猜你喜欢

转载自forsave.iteye.com/blog/2294100