看完就不慌了!Netty源码之SizeClasses,秒会

本文介绍了Netty如何基于jemalloc4重构内存分配,重点关注SizeClasses类的作用和内存规格的优化,以减少内存碎片。Netty通过SizeClasses维护了一个二维数组,用于记录内存规格的详细信息,并通过特定公式计算size与index的关系,实现更细粒度的内存划分。此外,文章还提及了SizeClassesMetric、isMultiPageSize等相关概念。
摘要由CSDN通过智能技术生成

概述

接下来的是详解 Netty 基于 jemalloc4 重构内存分配的思想以及源码。jemalloc4 相较于 jemalloc3 最大的提升是进一步优化内存碎片问题,因为在 jemalloc3 中最多可能会导致 50% 内存碎片,但 jemalloc4 通过划分更细粒度的内存规格在一定程度上改善了这一问题,这也是SizeClasses的由来。

Netty 重构了和内存分配相关的核心类,比如 PoolArena、PoolChunk、PoolSubpage 以及和缓存相关的 PoolThreadCache,并且新增了一个 SizeClasses 类。从整体上看,Netty 分配内存的逻辑是和 jemalloc3 大致相同:

  1. 首先尝试从本地缓存中分配,分配成功则返回。
  2. 分配失败则委托 PoolArena 进行内存分配,PoolArena 最终还是委托 PoolChunk 进行内存分配。
  3. PoolChunk 根据内存规格采取不同的分配策略。
  4. 内存回收时也是先通过本地线程缓存回收,如果实在回收不了或超出阈值,会交给关联的 PoolChunk 进行内存块回收。

jemalloc4 主要是对 PoolChunk 的内存分析进行了重构,这是我们这两篇文章分析的重点类。但是在分析它之前我们还需要对 SizeClasses 这个规格类进行讲解。 在旧版本中,对内存规格是按下图划分的:

看完就不慌了!Netty源码之SizeClasses,秒会

 

仔细发现,在 Small 级别的内存分配中会存在大量的内存碎片: 比如用户申请内存大小为

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值