PooledByteBuf分配及回收之三PoolAerna初始化

PooledByteBufAllocator初始化

PoolThreadCache初始化

PoolAerna初始化

PoolChunk初始化

PoolSubpage初始化

PooledUnsafeDirectByteBuf初始化

分配微小型PooledByteBuf(未命中缓存场景)

分配小型PooledByteBuf(未命中缓存场景)

分配普通型PooledByteBuf(未命中缓存场景)

PoolChunkList源码解析

ReferenceCountUpdater源码解析

Recycler及基内部类初始化

Recycler.Stack<T> 压入对象

Recycler.Stack<T> 弹出对象

PooledByteBuf的回收

属性含义

static final boolean HAS_UNSAFE

是否有UNSAFE

PlatformDependent.hasUnsafe()


static final int numTinySubpagePools

 

微小子页池中页的数量512 >>> 4  也就是32

final PooledByteBufAllocator parent

 

属于哪个分配器  
private final int maxOrder
 
指数,与pageSize一起决定chunk的大小11
final int pageSize
 
页的大小8192
final int pageShifts
 
页大小的位移,本质上是pageSize的二进制从右开始第一个1的右面0的数量,如pageSize=2 则 pageShifts=1,在这里pageSize=8192,pageShifts=1313
final int chunkSize
 
chunk的大小8192 << 11 也就是16MB

final int subpageOverflowMask

子页面溢出掩码,主要作用是判断某个size是否小于pageSize 

如果size & subpageOverflowMask == 0 那么 size小于pageSize

~(page -1)    page-1=8191 二进制为  0000 0000 0000 0000 000  1111  1111  1111  1

再取反后变为                                      1111  1111 1111  1111  111   0000 0000  0000 0

final int numSmallSubpagePools
 
小型子页面池中页的数量pageShifts - 9 = 4
final int directMemoryCacheAlignment  
final int directMemoryCacheAlignmentMask  
private final PoolSubpage<T>[] tinySubpagePools
 

微小型子页面池

它是一个长度为32的PoolSubpage数组,其中每个元素代表了一种微小型内存的大小(均为16的位数)

如tinySubpagePools[0] 代表0B,tinySubpagePools[1] 代表16B,tinySubpagePools[2] 代表32B,依此类推,最大496B。

tinySubpagePools = new PoolSubpage[numTinySubpagePools]
for (int i = 0; i < tinySubpagePools.length; i ++) {
    tinySubpagePools[i] = newSubpagePoolHead(pageSize);
}
private PoolSubpage<T> newSubpagePoolHead(int pageSize) {
    PoolSubpage<T> head = new PoolSubpage<T>(pageSize);
    head.prev = head;
    head.next = head;
    return head;
}
private final PoolSubpage<T>[] smallSubpagePools
 
小型子页面池  
smallSubpagePools = new PoolSubpage[numSmallSubpagePools];
for (int i = 0; i < smallSubpagePools.length; i ++) {
    smallSubpagePools[i] = newSubpagePoolHead(pageSize);
}
private PoolSubpage<T> newSubpagePoolHead(int pageSize) {
    PoolSubpage<T> head = new PoolSubpage<T>(pageSize);
    head.prev = head;
    head.next = head;
    return head;
}
private final PoolChunkList<T> q050Chunk池  本质上是一个双向链表
new PoolChunkList<T>(this, q075, 50, 100, chunkSize) 
最小使用量为50,最大使用量100
q050.prevList(q025);
private final PoolChunkList<T> q025Chunk池  本质上是一个双向链表
new PoolChunkList<T>(this, q050, 25, 75, chunkSize)  
最小使用量为25,最大使用量75
q025.prevList(q000)
private final PoolChunkList<T> q000Chunk池  本质上是一个双向链表
new PoolChunkList<T>(this, q025, 1, 50, chunkSize)  
最小使用量为1,最大使用量50
q000.prevList(null)
private final PoolChunkList<T> qInitChunk池  本质上是一个双向链表
new PoolChunkList<T>(this, q000, Integer.MIN_VALUE, 25, chunkSize) 
最小使用量为Integer.MIN_VALUE,最大使用量25
qInit.prevList(qInit)
private final PoolChunkList<T> q075Chunk池  本质上是一个双向链表
new PoolChunkList<T>(this, q100, 75, 100, chunkSize) 
最小使用量为75,最大使用量100
q075.prevList(q050);
private final PoolChunkList<T> q100Chunk池  本质上是一个双向链表
new PoolChunkList<T>(this, null, 100, Integer.MAX_VALUE, chunkSize) 
最小使用量为100,最大使用量Integer.MAX_VALUEq100.prevList(q075);
private final List<PoolChunkListMetric> chunkListMetrics 
List<PoolChunkListMetric> metrics = new ArrayList<PoolChunkListMetric>(6);
metrics.add(qInit);
metrics.add(q000);
metrics.add(q025);
metrics.add(q050);
metrics.add(q075);
metrics.add(q100);
chunkListMetrics = Collections.unmodifiableList(metrics);
private long allocationsNormal
 
分配和解除分配的指标   
private final LongCounter allocationsTiny
 
   PlatformDependent.newLongCounter()
private final LongCounter allocationsSmall   PlatformDependent.newLongCounter()
private final LongCounter allocationsHuge   PlatformDependent.newLongCounter()
private final LongCounter activeBytesHuge   PlatformDependent.newLongCounter()
private long deallocationsTiny  
private long deallocationsSmall  
private long deallocationsNormal  
private final LongCounter deallocationsHuge   PlatformDependent.newLongCounter()
final AtomicInteger numThreadCaches使用此区域的线程数量new AtomicInteger()

 

构造方法

protected PoolArena(PooledByteBufAllocator parent, int pageSize,
          int maxOrder, int pageShifts, int chunkSize, int cacheAlignment) {
        this.parent = parent;
        this.pageSize = pageSize;
        this.maxOrder = maxOrder;
        this.pageShifts = pageShifts;
        this.chunkSize = chunkSize;
        directMemoryCacheAlignment = cacheAlignment;
        directMemoryCacheAlignmentMask = cacheAlignment - 1;
        subpageOverflowMask = ~(pageSize - 1);
        tinySubpagePools = newSubpagePoolArray(numTinySubpagePools);
        for (int i = 0; i < tinySubpagePools.length; i ++) {
            tinySubpagePools[i] = newSubpagePoolHead(pageSize);
        }

        numSmallSubpagePools = pageShifts - 9;
        smallSubpagePools = newSubpagePoolArray(numSmallSubpagePools);
        for (int i = 0; i < smallSubpagePools.length; i ++) {
            smallSubpagePools[i] = newSubpagePoolHead(pageSize);
        }

        q100 = new PoolChunkList<T>(this, null, 100, Integer.MAX_VALUE, chunkSize);
        q075 = new PoolChunkList<T>(this, q100, 75, 100, chunkSize);
        q050 = new PoolChunkList<T>(this, q075, 50, 100, chunkSize);
        q025 = new PoolChunkList<T>(this, q050, 25, 75, chunkSize);
        q000 = new PoolChunkList<T>(this, q025, 1, 50, chunkSize);
        qInit = new PoolChunkList<T>(this, q000, Integer.MIN_VALUE, 25, chunkSize);

        q100.prevList(q075);
        q075.prevList(q050);
        q050.prevList(q025);
        q025.prevList(q000);
        q000.prevList(null);
        qInit.prevList(qInit);

        List<PoolChunkListMetric> metrics = new ArrayList<PoolChunkListMetric>(6);
        metrics.add(qInit);
        metrics.add(q000);
        metrics.add(q025);
        metrics.add(q050);
        metrics.add(q075);
        metrics.add(q100);
        chunkListMetrics = Collections.unmodifiableList(metrics);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值