Netty内存管理系统原理二

netty4.1.44之前的版本是jemalloc3,之后的版本都是经过优化之后的jemalloc4。

PoolArena的核心成员

PoolArena 提供 DirectArena 和 HeapArena 子类,这是因为底层容器类型不同所以需要子类区分。但核心逻辑是在 PoolArena 完成的。

PoolArena 的数据结构大致(除去监测指标数据)可分为两大类:

  • 存储 PoolChunk 的 6 个 PoolChunkList
  • 存储 PoolSubpage 的 2 个数组。

PoolArena 构造器初始化也做了很多重要的工作,包含串联 PoolChunkList 以及初始化 PoolSubpage[] 。

存储 PoolChunk 的 6 个 PoolChunkList

q000、q025、q050、q075、q100 表示最低内存使用率。如下图所示

任意 PoolChunkList 都有内存使用率的上下限:

  • minUsag
  • maxUsage

如果使用率超过 maxUsage,那么 PoolChunk 会从当前 PoolChunkList 移除,并移动到下一个PoolChunkList 。同理,如果使用率小于 minUsage,那么 PoolChunk 会从当前 PoolChunkList 移除,并移动到前一个PoolChunkList。

每个 PoolChunkList 的上下限都有交叉重叠的部分,为什么呢?

因为 PoolChunk 需要在 PoolChunkList 不断移动,如果临界值恰好衔接的,则会导致 PoolChunk 在两个 PoolChunkList 不断移动,造成性能损耗。

q000 这个 PoolChunkList 是没有前向节点,为什么呢?

因为当其余 PoolChunkList 没有合适的 PoolChunk 可以分配内存时,会创建一个新的 PoolChunk 放入 pInit 中,然后根据用户申请内存大小分配内存。而在 p000 中的 PoolChunk ,如果因为内存归还的原因,使用率下降到 0%,则不需要放入 pInit,而是直接执行销毁方法,将整个内存块的内存释放掉。这样,内存池中的内存就有生成/销毁等完成生命周期流程,避免了在没有使用情况下还占用内存。

4.2 PoolArena 中的两个 PoolSubpage 数组

两个 PoolSubpage<T> 数组正如属性名 tinySubpagePools、smallSubpagePools,是分别负责小于 8KB 的 tiny 和 small 类型的内存分配。

Tiny 类型内存区间:[16B,496B],从 16B 开始,以 16B 递增,直到 496B,共有 31 个不同的值,tinySubpagePools 数组的大小为 numTinySubpagePools = 32。申请 tiny 内存时,根据 PoolArena.tinyIdx方法计算出在数组中的 index。

Small 类型内存区间:512B、1KB、2KB、4KB,有 4 个不同的值,smallSubpagePools 数组的大小为 numSmallSubpagePools = 4。申请 small 内存时,根据 PoolArena.smallIdx方法计算出在数组中的 index。

ProcessOn Flowchart

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值