Netty里的内存管理是通过ByteBuf这个类作为桥梁连接着业务代码与jdk底层的内存。所以理解ByteBuf的结构就很有必要了。
ByteBuf
ByteBuf的内部结构如下图:![5796101-19fe73a41485518b.png](https://i-blog.csdnimg.cn/blog_migrate/fdb27d4523a4091b31e46274326d02f1.webp?x-image-process=image/format,png)
![5796101-157ef86c4576f762.png](https://i-blog.csdnimg.cn/blog_migrate/d75ddba7e560b0fc8a50f20bb27ecc1d.webp?x-image-process=image/format,png)
ByteBuf类结构图
ByteBuf分类
- Pooled和Unpooled:pooled类型的bytebuf是在已经申请好的内存块取一块内存,而Unpooled是直接通过JDK底层代码申请。
- Unsafe和非Unsafe:这里的Unsafe是JDK底层的对象,通过它能够直接操作到内存。
- Heap和Direct:一个是在堆上分配,一个是直接内存。Direct不受GC的控制。
ByteBufAllocator
ByteBuf对象是通过ByteBufAllocator来进行生成的,其中AbstractByteBufAllocator里实现在大部分的功能,具体是pooled还是unpooled类型的byteBuf是留给相应的子类来实现的,而Heap和Direct是通过暴露不同的接口来区分的,Unsafe与非Unsafe是通过JDK内部的平台来进行判断是否能生成Unsafe类的ByteBuf。ByteBufAllocator类图如下:![5796101-8a52c4f63ea6659a.png](https://i-blog.csdnimg.cn/blog_migrate/6f1dcf980eafb99542607e624692e738.webp?x-image-process=image/format,png)
ByteBufAllocator类图
UnpooledByteBufAllocator分配heap内存
- 通过调用heapBuffer方法分配一块heap内存
<