netty源码解析(4.0)-28 ByteBuf内存池:PooledByteBufAllocator-把一切组装起来

本文详细介绍了Netty中的PooledByteBufAllocator如何管理内存,包括初始化参数、PoolArena和PoolThreadCache的创建,以及内存分配和释放的完整流程。通过分析关键组件如PoolChunkList和PoolChunk,展示了Netty如何高效利用堆和直接内存。
摘要由CSDN通过智能技术生成

  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              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值