news 2026/6/22 16:31:51

【Netty源码解读和权威指南】第40篇:Netty内存管理深度解析——PoolChunk/PoolArena源码全剖析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Netty源码解读和权威指南】第40篇:Netty内存管理深度解析——PoolChunk/PoolArena源码全剖析

上一篇【第39篇】Netty内存泄漏检测机制源码解析——守护ByteBuf的“生死账本“
下一篇【第41篇】Netty开发HTTP服务——打造轻量级Web服务器(明日更新,敬请期待)


一、内存管理架构

PooledByteBufAllocator ├── heapArenas[N] (堆内Arena数组) └── directArenas[N] (直接内存Arena数组) │ ├── PoolChunkList[6] (按使用率分6级) │ └── PoolChunk (16MB) │ ├── PoolSubpage[2048] (8KB/页) │ │ └── bitmap (按规格切割: 16B/32B/...) │ └── memoryMap (完全二叉树,buddy算法) │ └── PoolThreadCache (线程缓存) ├── tinySubPageCaches[32] (<512B) ├── smallSubPageCaches[4] (512B~8KB) └── normalCaches[3] (8KB~16MB)

二、PoolChunk:buddy算法分配≥8KB

// Chunk = 16MB = 2048 × 8KB pages// 使用完全二叉树管理,深度11层// memoryMap: 4096个节点的数组// allocateRun(normCapacity):分配≥8KB的内存longallocateRun(intnormCapacity){intd=maxOrder-log2(normCapacity/pageSize);// 计算深度intid=allocateNode(d);// 在二叉树中查找空闲节点updateParentsAlloc(id);// 更新父节点的分配状态returnid;}// memoryMap[id] = depth_of_id 表示空闲// memoryMap[id] = 不可用值(12) 表示已分配intallocateNode(intd){intid=1;// 从根节点开始for(inti=1;i<=d;i++){intleft=id<<1;intright=left|1;if(memoryMap[left]<=d){id=left;// 左子树有空闲}elseif(memoryMap[right]<=d){id=right;// 右子树有空闲}else{return-1;// 无可用空间}}memoryMap[id]=12;// 标记为已分配returnid;}

三、PoolSubpage:slab分配<8KB

// 一页8KB,切成n个等大小块// 例如:请求1KB → 切成8块,每块1KB// 使用bitmap管理分配longallocate(){intbitmapIdx=getNextAvail();// bitmap找空闲位intq=bitmapIdx>>>6;// bitmap中的第几个longintr=bitmapIdx&63;// long中的第几个bitbitmap[q]|=1L<<r;// 标记为已分配returntoHandle(bitmapIdx);}

四、分配流程

请求分配1024字节 ↓ 优先查 PoolThreadCache(线程缓存) ↓ 未命中 查 PoolArena ↓ < 8KB? → PoolSubpage (slab分配) ↓ ≥ 8KB? → PoolChunk (buddy分配) ↓ 无可用Chunk 创建新Chunk → 分配

五、内存池回收

// Chunk使用率降到0% → 从活跃列表移除 → 可能被回收// 使用率变化在 q000→q025→q050→q075→q100 之间迁移// 6级ChunkList:// qInit → q000 → q025 → q050 → q075 → q100// (使用率0-25%) (25-50%) (50-75%) (75-100%)

六、总结

组件职责大小范围
PoolThreadCache线程级缓存多种规格
PoolSubpageslab小对象分配< 8KB
PoolChunkbuddy大对象分配8KB ~ 16MB
PoolArena管理ChunkList整体协调

上一篇【第39篇】Netty内存泄漏检测机制源码解析——守护ByteBuf的“生死账本“
下一篇【第41篇】Netty开发HTTP服务——打造轻量级Web服务器(明日更新,敬请期待)


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

嵌入式GUI多语言支持:从编码原理到emWin实战指南

1. 嵌入式GUI多语言支持&#xff1a;从原理到实战的完整指南在开发面向全球市场的嵌入式设备时&#xff0c;无论是工业HMI触摸屏、智能家电的控制面板&#xff0c;还是便携式医疗设备的操作界面&#xff0c;多语言支持都是一个绕不开的核心需求。这不仅仅是把界面上的“OK”按钮…

作者头像 李华
网站建设 2026/6/22 11:37:38

Linux下gpgsplit命令详解:OpenPGP数据包拆分与安全分析实战

1. 项目概述&#xff1a;为什么需要关注gpgsplit&#xff1f; 在Linux的日常运维、安全审计或者软件包管理工作中&#xff0c;我们经常会与GnuPG&#xff08;GNU Privacy Guard&#xff09;打交道。无论是验证软件源签名的完整性&#xff0c;还是加密一封敏感邮件&#xff0c;G…

作者头像 李华
网站建设 2026/6/20 14:59:02

5分钟上手:无需训练的AI换脸工具roop-unleashed终极指南

5分钟上手&#xff1a;无需训练的AI换脸工具roop-unleashed终极指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 你是否曾想过&#xff0c;只需一张照片…

作者头像 李华
网站建设 2026/6/22 16:28:11

ab融帧视频怎么调色:2026视频融合工作流,5款工具横评

二创与矩阵号为什么总在AB融帧调色上翻车做影视二创或短视频矩阵的团队&#xff0c;经常遇到一个棘手问题&#xff1a;素材拼接后画面色彩割裂。尤其是涉及AB融帧去重时&#xff0c;A素材和B素材的色温、对比度不一致&#xff0c;导致成品看起来像劣质拼接&#xff0c;甚至直接…

作者头像 李华
网站建设 2026/6/20 14:42:31

OpenClaw部署实战:AI工具链落地的最后一公里

1. OpenClaw 是什么&#xff1f;它解决的不是“部署问题”&#xff0c;而是“AI 工具链落地的最后一公里”OpenClaw 这个名字在最近三个月的技术社区里出现频率陡增&#xff0c;但绝大多数人点开 GitHub 仓库后第一反应是&#xff1a;“这到底是个 CLI 工具&#xff1f;还是个 …

作者头像 李华
网站建设 2026/6/20 14:38:57

5分钟掌握AI语音克隆:RVC变声框架实战指南

5分钟掌握AI语音克隆&#xff1a;RVC变声框架实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-WebUI …

作者头像 李华