publicPooledByteBufAllocator(boolean preferDirect, int nHeapArena, int nDirectArena, int pageSize, int maxOrder, int tinyCacheSize, int smallCacheSize, int normalCacheSize, boolean useCacheForAllThreads, int directMemoryCacheAlignment){ // 指定是否使用直接内存 super(preferDirect); // 创建PoolThreadLocalCache,useCacheForAllThreads是否允许使用对象池 threadCache = new PoolThreadLocalCache(useCacheForAllThreads); // tiny类型缓存大小 this.tinyCacheSize = tinyCacheSize; // small类型缓存大小 this.smallCacheSize = smallCacheSize; // normal类型缓存大小 this.normalCacheSize = normalCacheSize; // chunk大小默认16M chunkSize = validateAndCalculateChunkSize(pageSize, maxOrder); // 需正数 checkPositiveOrZero(nHeapArena, "nHeapArena"); checkPositiveOrZero(nDirectArena, "nDirectArena");
checkPositiveOrZero(directMemoryCacheAlignment, "directMemoryCacheAlignment"); if (directMemoryCacheAlignment > 0 && !isDirectMemoryCacheAlignmentSupported()) { thrownew IllegalArgumentException("directMemoryCacheAlignment is not supported"); }
if ((directMemoryCacheAlignment & -directMemoryCacheAlignment) != directMemoryCacheAlignment) { thrownew IllegalArgumentException("directMemoryCacheAlignment: " + directMemoryCacheAlignment + " (expected: power of two)"); } // 页偏移默认为13,pageShift = Integer.SIZE - 1 - Integer.numberOfLeadingZeros(8192) = 32 - 1 - 18 = 13 int pageShifts = validateAndCalculatePageShifts(pageSize);
if (nHeapArena > 0) { // 堆内存,创建PoolArena[]数组 heapArenas = newArenaArray(nHeapArena); List<PoolArenaMetric> metrics = new ArrayList<PoolArenaMetric>(heapArenas.length); // 给数组元素赋值HeapArena for (int i = 0; i < heapArenas.length; i ++) { PoolArena.HeapArena arena = new PoolArena.HeapArena(this, pageSize, maxOrder, pageShifts, chunkSize, directMemoryCacheAlignment); heapArenas[i] = arena; metrics.add(arena); } heapArenaMetrics = Collections.unmodifiableList(metrics); } else { heapArenas = null; heapArenaMetrics = Collections.emptyList(); }
if (nDirectArena > 0) { // 堆外直接内存,创建PoolArena[]数组 directArenas = newArenaArray(nDirectArena); List<PoolArenaMetric> metrics = new ArrayList<PoolArenaMetric>(directArenas.length); // 直接内存数组赋值DirectArena for (int i = 0; i < directArenas.length; i ++) { PoolArena.DirectArena arena = new PoolArena.DirectArena( this, pageSize, maxOrder, pageShifts, chunkSize, directMemoryCacheAlignment); directArenas[i] = arena; metrics.add(arena); } directArenaMetrics = Collections.unmodifiableList(metrics); } else { directArenas = null; directArenaMetrics = Collections.emptyList(); } metric = new PooledByteBufAllocatorMetric(this); }