PooledByteBufAllocator负责初始化PoolArena(PA)和PoolThreadCache(PTC)。它提供了一系列的接口,用来创建使用堆内存或直接内存的PooledByteBuf对象,这些接口只是一张皮,内部完全使用了PA和PTC的能力。初始化过程分两个步骤,首先初始化一系列的默认参数,然后初始化PTC对象和PA数组。
默认参数和它们的值
DEFAULT_PAGE_SIZE: PoolChunk中的page的大小-pageSize, 使用-Dio.netty.allocator.pageSize设置, 默认值:8192。
DEFAULT_MAX_ORDER: PoolChunk中二叉树的高度: maxOrder, 使用-Dio.netty.allocator.maxOrder设置,默认值:11。
DEFAULT_NUM_HEAP_ARENA: 使用堆内存的PA数组的长度,使用-Dio.netty.allocator.numHeapArenas设置,默认值: CPU核心数 * 2。
DEFAULT_NUM_DIRECT_ARENA: 使用直接内存的PA数组的长度,使用-Dio.netty.allocator.numHeapArenas设置,默认值: CPU核心数 * 2。
DEFAULT_TINY_CACHE_SIZE: PTC对象中每个用来缓存Tiny内存的MemoryRegionCache对象中queue的长度,使用-Dio.netty.allocator.tinyCacheSize设置,默认值:512。
DEFAULT_SMALL_CACHE_SIZE: PTC对象中每个用来缓存Small内存的MemoryRegionCache对象中queue的长度,使用-Dio.netty.allocator.smallCacheSize设置,默认值:256。
DEFAULT_NORMAL_CACHE_SIZE: PTC对象中每个用来缓存Normal内存的MemoryRegionCache对象中queue的长度,使用-Dio.netty.allocator.normalCacheSize设置,默认值:64。
DEFAULT_MAX_CACHED_BUFFER_CAPACITY: PTC对象中缓存Normal内存的大小上限。使用-Dio.netty.allocator.maxCachedBufferCapacity设置,默认值32 * 1024。
DEFAULT_CACHE_TRIM_INTERVAL: PTC对象中释放缓存的内存阈值。当PTC分配内存次数大于这个值时会释放缓存的内存。使用-Dio.netty.allocator.cacheTrimInterval设置,默认值:8192。
DEFAULT_USE_CACHE_FOR_ALL_THREADS: 是否对所有的线程使用缓存。使用-Dio.netty.allocator.useCacheForAllThreads设置,默认值:true。
DEFAULT_DIRECT_MEMORY_CACHE_ALIGNMENT: 直接内存的对齐参数,分配直接内存的大小必须是它的整数倍。使用-Dio.netty.allocator.directMemoryCacheAlignment设置,默认值:0, 表示不对齐。
初始化PoolArena数组
PooledByteBufAllocator维护了两个数组:
PoolArena<byte[]>[] heapArenas; PoolArena<ByteBuffer>[] directArenas;
heapArenas用来管理堆内存,directArenas用来管理直接内存。这两个数组在构造方法中初始化,构造方法的定义是:
public PooledByteBufAllocator(boolean preferDirect, int nHeapArena, int nDirectArena, int pageSize, int maxOrder, int tinyCacheSize, int smallCacheSize, int normalCacheSize, boolean useCacheForAllThreads, int directMemoryCacheAlignment)
prefreDirect: 创建PooledByteBuf时,是否优先使用直接内存。
nHeapArena: 默认使用DEFAULT_NUM_HEAP_ARENA。
nDirectArena: 默认使用DEFAULT_NUM_DIRECT_ARENA。
pageSize: 默认使用的DEFAULT_PAGE_SIZE。
maxOrder: 默认使用DEFAULT_MAX_ORDER。
tinyCacheSize: 默认使用DEFAULT_TINY_CACHE_SIZE。
smallCacheSize: 默认使用DEFAULT_SMALL_CACHE_SIZE。
normalCacheSize: 默认使用DEFAULT_NORMAL_CACHE_SIZE。
useCacheForAllThreads: 默认使用DEFAULT_USE_CACHE_FOR_ALL_THREADS。
directMemoryCacheAlignment: 默认使用DEFAULT_DIRECT_MEMORY_CACHE_ALIGNMENT。
这两数组的初始化代码如下:
1 int pageShifts = validateAndCalculatePageShifts(pageSize); 2 3 if (nHeapArena > 0) { 4 heapArenas = newArenaArray(nHeapArena); 5 List<PoolArenaMetric> metrics = new ArrayList<PoolArenaMetric>(heapArenas.length); 6 for (int i = 0; i < heapArenas.length; i ++) { 7 PoolArena.HeapArena arena = new PoolArena.HeapArena(this, 8 pageSize, maxOrder, pageShifts, chunkSize, 9 directMemoryCacheAlignment); 10 heapArenas[i] = arena; 11 metrics.add(arena); 12 } 13 heapArenaMetrics = Collections.unmodifiableList(metrics); 14 } else { 15 heapArenas = null; 16 heapArenaMetrics = Collections.emptyList(); 17 } 18 19 if (nDirectArena > 0) { 20 directArenas = newArenaArray(nDirectArena); 21 List<PoolArenaMetric> metrics = new ArrayList<PoolArenaMetric>(directArenas.length); 22 for (int i = 0; i < directArenas.length; i ++) { 23