Netty源码分析:PooledByteBufAllocator
无论是我们使用语句ByteBuf byteBuf = Unpooled.buffer(256);
来分配buf,还是使用如下的语句来分配Buf:
PooledByteBufAllocator allocator = new PooledByteBufAllocator(false);
ByteBuf byteBuf = allocator.heapBuffer(15);
都是使用了 PooledByteBufAllocator 这个类类分配Buf。因此就来分析下这个类。
1、常量的说明
public class PooledByteBufAllocator extends AbstractByteBufAllocator {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(PooledByteBufAllocator.class);
//默认的PoolArena个数,堆内存类型
private static final int DEFAULT_NUM_HEAP_ARENA;
//默认的PoolArena个数,直接内存类型
private static final int DEFAULT_NUM_DIRECT_ARENA;
//默认的Page的个数,最小为4K,默认为8K
private static final int DEFAULT_PAGE_SIZE;
/*
由于每个chunk中的page是用平衡二叉树映射管理每个PoolSubpage是否被分配,
maxOrder为树的深度,深度为maxOrder层的节点数量为 1 << maxOrder。
*/
private static final int DEFAULT_MAX_ORDER; //默认为 11 //默认的tiny cache 的大小
private static final int DEFAULT_TINY_CACHE_SIZE; //512
//默认的small cache的大小
private static final int DEFAULT_SMALL_CACHE_SIZE;// 256
//默认的normal cache的大小
private static final int DEFAULT_NORMAL_CACHE_SIZE;//64
private static final int DEFAULT_MAX_CACHED_BUFFER_CAPACITY;
private static final int DEFAULT_CACHE_TRIM_INTERVAL;
//page容量的最小值,为4K。
private static final int MIN_PAGE_SIZE = 4096;
//最大chunk的大小,等于2的30次方,即1G。
private static final int MAX_CHUNK_SIZE = (int) (((long) Integer.MAX_VALUE + 1) / 2);
以上这些常量除了最后两个都是在如下的static块中进行初始化。
static {
int defaultPageSize = SystemPropertyUtil.getInt("io.netty.allocator.pageSize", 8192);
Throwable pageSizeFallbackCause = null;
try {
validateAndCalculatePageShifts(defaultPageSize);
} catch (Throwable t) {
pageSizeFallbackCause = t;
defaultPageSize = 8192;
}
DEFAULT_PAGE_SIZE = defaultPageSize;
int defaultMaxOrder = SystemPropertyUtil.getInt("io.netty.allocator.maxOrder", 11);
Throwable maxOrderFallbackCause = null;
try {
validateAndCalculateChunkSize(DEFAULT_PAGE_SIZE, defaultMaxOrder);