1、内存分配器
ByteBufAllocator
说明:默认实现是根据io.netty.allocator.type的属性值来创建的(unpooled或pooled),
如果该属性没有设置,会判断当前平台是否是Android,是(unpooled),否(pooled)。
根据上面的类型会调用对应的UnpooledByteBufAllocator或PooledByteBufAllocator
PooledByteBufAllocator
说明:静态代码块中的实现,通过获取io.netty.allocator.pageSize的值,给DEFAULT_PAGE_SIZE赋值,默认8192;
通过获取io.netty.allocator.maxOrder的值,给DEFAULT_MAX_ORDER赋值,默认11;
DEFAULT_NUM_HEAP_ARENA = io.netty.allocator.numHeapArenas,默认
DEFAULT_NUM_DIRECT_ARENA = io.netty.allocator.numDirectArenas,默认
DEFAULT_TINY_CACHE_SIZE = io.netty.allocator.tinyCacheSize,默认512
DEFAULT_SMALL_CACHE_SIZE = io.netty.allocator.smallCacheSize,默认256
DEFAULT_NORMAL_CACHE_SIZE = io.netty.allocator.normalCacheSize,默认64
DEFAULT_MAX_CACHED_BUFFER_CAPACITY = io.netty.allocator.maxCachedBufferCapacity,默认32*1024
DEFAULT_CACHE_TRIM_INTERVAL = io.netty.allocator.cacheTrimInterval,默认8192
DEFAULT_CACHE_TRIM_INTERVAL_MILLIS = io.netty.allocation.cacheTrimIntervalMillis,默认0
DEFAULT_USE_CACHE_FOR_ALL_THREADS = io.netty.allocator.useCacheForAllThreads,默认true
DEFAULT_DIRECT_MEMORY_CACHE_ALIGNMENT = io.netty.allocator.directMemoryCacheAlignment,默认0
DEFAULT_MAX_CACHED_BYTEBUFFERS_PER_CHUNK = io.netty.allocator.maxCachedByteBuffersPerChunk,默认1023
PoolThreadCache
PoolArena
PoolChunk
2、流程(默认实现)
io.netty.buffer.PooledByteBufAllocator#newHeapBuffer
1、先获取PoolThreadCache;
2、从PoolThreadCache中获取PoolArena<byte[]>;
io.netty.buffer.PoolArena#allocate
1、PooledHeapByteBuf.newInstance(maxCapacity);
2、根据normCapacity的大小采用不同的策略分配
PoolThreadCache#allocateTiny