上一节简单理解了以下ByteBuf的结构。详细的api还需要自己夺取尝试。
本节学些ByteBufAllocator
,内存分配器(管理器)
- 查看
ByteBufAllocator
,作为顶层接口,它根据内存分配的类型定制了一些分配方法,主要还是根据是否是堆内存来进行分配。
//根据具体的子类实现决定分配内存是direct还是head
ByteBuf buffer();
ByteBuf buffer(int var1);
ByteBuf buffer(int var1, int var2);
//分配一个是适用于IO的直接内存
ByteBuf ioBuffer();
ByteBuf ioBuffer(int var1);
ByteBuf ioBuffer(int var1, int var2);
//分配一块head内存
ByteBuf heapBuffer();
ByteBuf heapBuffer(int var1);
ByteBuf heapBuffer(int var1, int var2);
//分配一块direct内存
ByteBuf directBuffer();
ByteBuf directBuffer(int var1);
ByteBuf directBuffer(int var1, int var2);
//组合缓冲区
CompositeByteBuf compositeBuffer();
CompositeByteBuf compositeBuffer(int var1);
CompositeByteBuf compositeHeapBuffer();
CompositeByteBuf compositeHeapBuffer(int var1);
CompositeByteBuf compositeDirectBuffer();
CompositeByteBuf compositeDirectBuffer(int var1);
boolean isDirectBufferPooled();
int calculateNewCapacity(int var1, int var2);
-
AbstractByteBufAllocator
是顶层接口ByteBufAllocator
一个实现,作为一个抽象的类,骨架。看一下他的buffer()
方法。其实在AbstractByteBufAllocator
层面是没有定义Pooled和Unpooled
以及Safe和Unsafe
类别的内存分配,这一层只开放了一个抽象方法,具体的Pooled和Unpooled
交由子类实现。
@Override
public ByteBuf buffer() {
//是否是direct内存,调用具体不同的实现
if (directByDefault) {
//分配直接内存
return directBuffer();
}
//分配对内存
return heapBuffer();
}
@Override
public ByteBuf directBuffer() {
//参数:默认的容量256,最大容量Integer.MAX_VALUE;
return directBuffer(DEFAULT_INITIAL_CAPACITY, DEFAULT_MAX_CAPACITY);
}
@Override
public ByteBuf directBuffer(int initialCapacity, int maxCapacity) {
//检验
if (initialCapacity == 0 && maxCapacity == 0) {
return emptyBuf;
}
//校验参数设置是否正确
validate(initialCapacity, maxCapacity);
//创建DirectBuffer
return newDirectBuffer(initialCapacity, maxCapacity);
}
/**
* Create a direct {@link ByteBuf} with the given initialCapacity and maxCapacity.
*/
protected abstract ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity);
- 关于
Safe和Unsafe类别的内存分配
,netty是根据jdk底层是否由封装的unsafe
来进行分配的,查看UnpooledByteBufAllocator#newHeapBuffer()
@Override
protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity) {
//判断是有unsafe来分配
return PlatformDependent.hasUnsafe() ?
new InstrumentedUnpooledUnsafeHeapByteBuf(this, initialCapacity, maxCapacity) :
new InstrumentedUnpooledHeapByteBuf(this, initialCapacity, maxCapacity);
}