news 2026/3/22 3:33:58

jemalloc思想的极致演绎:深度解构Netty内存池的精妙设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jemalloc思想的极致演绎:深度解构Netty内存池的精妙设计与实现

Netty内存池的核心设计借鉴了jemalloc的设计思想。jemalloc是由Jason Evans在FreeBSD项目中实现的高性能内存分配器,其核心优势在于通过细粒度内存块划分与多层级缓存机制,降低内存碎片率并优化高并发场景下的内存分配吞吐量。

Netty基于jemalloc的多Arena架构实现内存池化,每个运行实例维护固定数量的内存分配域(Arena),默认数量与处理器核心数呈正相关。此设计通过多Arena的锁分离机制,将全局竞争分散到独立的Arena实例中。在高并发场景下,当线程进行内存分配时,仅需竞争当前Arena的局部锁,而非全局锁,从而实现近似无锁化的分配效率。

线程首次执行内存操作时,通过轮询算法动态绑定至特定Arena,该策略确保各Arena间的负载均衡。同时,Netty采用线程本地存储技术,使每个线程持久化维护其绑定Arena的元数据及缓存状态。这种设计实现三级优化。

1)无锁化访问:线程直接操作本地缓存的Arena元数据,消除跨线程同步开销;

2)缓存亲和性:内存块在线程本地存储中形成局部缓存,提升处理器缓存命中率;

3)资源隔离:各Arena独立管理内存段,避免伪共享问题。

image

内存规格

Arena中的内存单位主要包括Chunk、Page和Subpage。其中,Chunk是Arena中最大的内存单位,也是Netty向操作系统申请内存的基本单位,默认大小为16MB。每个Chunk会被进一步划分为2048个Page,每个Page的大小为8KB。

Netty针对不同的内存规格采用了不同的分配策略。

1)当申请的内存小于8KB时,由Subpage负责管理内存分配;

2)当申请的内存大于8KB时,采用Chunk中的Page级别分配策略;

3)为了提高小内存分配的效率,Netty还引入了本地线程缓存机制,用于处理小于8KB的内存分配请求。

image

Chunk内部通过伙伴算法(Buddy Algorithm)管理多个Page,并通过一棵满二叉树实现内存分配。在这棵二叉树中,每个子节点管理的内存也属于其父节点。例如,当申请16KB的内存时,系统会从根节点开始逐层查找可用的节点,直到第10层。

image

为了判断一个节点是否可用,Netty在每个节点内部维护了一个值,用于指示该节点及其子节点的分配状态。

1)如果第9层节点的值为9,表示该节点及其所有子节点都未被分配;

2)如果第9层节点的值为10,表示该节点本身不可分配,但其第10层的子节点可以被分配;

3)如果第9层节点的值为12,表示该节点及其所有子节点都不可分配,因为可分配节点的深度超过了树的总深度。

Subpage

为了提高内存分配的利用率,Netty在分配小于8KB的内存时,不再直接分配整个Page,而是将Page进一步划分为更小的内存块,由Subpage进行管理。Subpage根据内存块的大小分为两大类。

1)Tiny:小于512B的内存请求,最小分配单位为16B,对齐大小也为16B。其区间为[16B, 512B),共有32种不同的规格。

2)Small:大于等于512B但小于8KB的内存请求,共有四种规格:512B、1024B、2048B和4096B。

Subpage采用位图(bitmap)来管理空闲内存块。由于不存在申请连续多个内存块的需求,Subpage的分配和释放操作非常简单高效。

例如,假设需要分配20B的内存,系统会将其向上取整到32B。对于一个8KB(8192B)的Page,可以划分为8192B / 32B = 256个内存块。由于每个long类型有64位,因此需要256 / 64 = 4个long类型的变量来描述所有内存块的分配状态。因此,位图数组的长度为4,分配时从bitmap[0]开始记录。每分配一个内存块,系统会将bitmap[0]中的下一个二进制位标记为1,直到bitmap[0]的所有位都被占用后,再继续分配bitmap[1],依此类推。

在首次申请小内存空间时,系统需要先申请一个空闲的页,并将该页标记为已占用。随后,该Subpage会被存入Subpage池中,以便后续直接从池中分配。Netty中共定义了36种Subpage规格,因此使用36个Subpage链表来表示Subpage内存池。

image

ChunkList

由于单个Chunk的大小仅为16MB,在实际应用中远远不够,因此Netty会创建多个Chunk,并将它们组织成一个链表。这些链表由 ChunkList持有,而ChunkLis 是根据Chunk的内存使用率来组织的,每个ChunkList 都有一个明确的使用率范围。

image

ChunkList的使用率范围是重叠的,例如q025的[25%, 50%)和q050的[50%, 75%),两者在 50% 处存在重叠。这种重叠设计并非偶然,而是 Netty 为了优化内存管理而有意引入的。

如果没有重叠区间,当一个Chunk的使用率刚好达到某个ChunkList的边界时,它会被立即移动到另一个链表中。例如:如果一个Chunk的使用率从24.9%增加到25%,它会从q000 移动到q025;如果使用率从25%降低到24.9%,它又会从q025移动回q000。这种频繁的移动会导致额外的性能开销。

通过引入重叠区间,Netty可以避免这种频繁的移动。例如:在q025的范围为[25%, 50%) 时,即使Chunk的使用率降低到25%,它仍然可以保留在q025中,直到使用率降低到25%以下(即进入q000的范围)。

同理,当Chunk的使用率增加到50%时,它仍然可以保留在q025中,直到使用率超过50% 才移动到 q050。

总结:从I/O到内存的协同进化

高性能网络架构的构建并非单一技术的堆砌,而是一个自底向上、层层递进的协同进化过程。

1)核心矛盾:其根源在于,应用程序的数据处理需求与操作系统提供的底层I/O能力之间存在巨大的协作鸿沟。传统的阻塞I/O模型,正是这种鸿沟导致效能损耗的直接体现。

2)调度权转移:I/O模型的演进史,本质上是一部资源调度权的自底向上转移史。从应用层被动等待(阻塞I/O),到将调度权交给内核(I/O多路复用),再到内核主动完成全部工作(异步I/O),系统的控制流越来越智能,资源利用也越来越高效。

3)架构具象化:Reactor模型通过职责分离和事件驱动,将这种高效的调度思想具象化为可落地的软件架构。主从Reactor模式将资源模块化,实现了流水线式的并行处理,使系统效能得以最大化。

4)效率的终极追求:当I/O和线程模型优化到极致后,内存管理成为新的决胜点。内存池技术,特别是Netty的精细化设计,其核心思想是“用结构化预置取代随机化操作”。通过空间预占(预分配)和精准复用(多级缓存与规格匹配),它将高昂的动态内存操作,转化为低成本的确定性计算,使内存调度效率与硬件承载能力完美匹配。

最终,当事件驱动降低了线程调度的微观成本,资源复用消除了内存管理的隐性消耗,而分层解耦提升了模块协作的宏观效率时,一个高吞吐、低延迟的健壮系统便水到渠成。这不仅仅是技术的胜利,更是对系统复杂性进行有序治理的架构智慧的体现。

很高兴与你相遇!如果你喜欢本文内容,记得关注哦

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 8:41:43

多智能体协同系统

多智能体协同系统的核心概念 多智能体协同系统(Multi-Agent Systems, MAS)通过多个自主智能体的交互实现复杂任务,广泛应用于机器人协作、自动驾驶、游戏AI等领域。核心特性包括分布式决策、通信协议、任务分配与冲突解决。典型应用案例 1. 无…

作者头像 李华
网站建设 2026/3/15 10:00:58

多角度关于人的本质的论述,你怎么思考?

第六章:多角度关于人的本质的论述人的本质,人和动物的区别是什么,此文可以参考。这个问题很深奥,历来人类试图回答。比如中国古代对于人,有善恶之分,但这显然不具有说服力。以下是马克思哲学关于人本质的思…

作者头像 李华
网站建设 2026/3/15 9:50:58

Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(六)

Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(六) Flutter: 3.35.6 前面有人提到在元素内部的那块判断怎么那么写的,看来对知识渴望的小伙伴还是有,这样挺好的。不至于说牢记部分知识,只需要大致了解一下有…

作者头像 李华
网站建设 2026/3/15 4:35:11

python作业4

a 56 b -18# 1. 按位与(&):对应位都为1则为1,否则为0 # 56: 00111000 # -18补码: 11101110 # 按位与: 00101000 → 十进制40 bit_and a & b print(f"按位与(&): {a} & {b} {bit_and}")# 2. 按位或(|):对应位有…

作者头像 李华
网站建设 2026/3/20 13:40:23

今天教大家免费使用先进的AI大模型,非常详细收藏这一篇就够了

为什么要使用ai模型? 用好ai可以解决你想做的事情比如数据录入、数据整理、数据分析、数据报告等等问题。只要你想好规则,他都可以给你生成,而且你要担心数据泄露问题,完全可以让他给你生成一个离线的app或者exe程序或者前端程序&…

作者头像 李华
网站建设 2026/3/16 6:12:32

边缘AI与端云协同架构

边缘AI与端云协同架构概述 边缘AI将人工智能模型部署在边缘设备(如手机、传感器、嵌入式设备)上,实现本地实时处理;端云协同通过边缘与云计算的协作,平衡计算负载、隐私与延迟。典型应用包括智能家居、工业检测、自动驾…

作者头像 李华