这个流程分为以下几个步骤:
1、从对象池里面拿到PooledByteBuf进行复用
2、从缓存上进行内存分配
3、从内存堆里面进行分配
接下来我们跟到代码里面去看一下,回到newDirectBuffer这个方法:
protected ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity) {
//拿到当前线程中的内存池
PoolThreadCache cache = threadCache.get();
//拿到当前内存池里面的directArena进行分配
PoolArena<ByteBuffer> directArena = cache.directArena;
ByteBuf buf;
if (directArena != null) {
buf = directArena.allocate(cache, initialCapacity, maxCapacity);
} else {
if (PlatformDependent.hasUnsafe()) {
buf = UnsafeByteBufUtil.newUnsafeDirectByteBuf(this, initialCapacity, maxCapacity);
} else {
buf = new UnpooledDirectByteBuf(this, initialCapacity, maxCapacity);
}
}
return toLeakAwareBuffer(buf);
}
这个方法做了两件事:
1、拿到当前线程的内存池
2、拿到内存池里面的direct