Netty高低版本内存管理对比&源码分析
创作时间:
作者:
@小白创作中心
Netty高低版本内存管理对比&源码分析
引用
1
来源
1.
https://juejin.cn/post/7478327254277308431
本文将对比分析Netty的两个版本(4.1.38.Final和4.1.112.Final)在内存管理方面的差异,并对源码进行详细解析。通过本文,读者可以深入了解Netty如何实现Java版的Jemalloc内存管理机制。
4.1.38 Final版本内存管理
内存管理作用
- 减少由于频繁向OS申请内存,导致的上下文切换次数;
- 高效分配内存,提升整体运行效率;
- 管理小内存,减少内存碎片的产生;
- 缓存小内存,避免重复创建对象;
- 减少垃圾回收压力。
使用方式
通过PooledByteBufAllocator开放统一的API接口,开放给用户使用:
PooledByteBufAllocator allocator = new PooledByteBufAllocator();
ByteBuf byteBuf = allocator.directBuffer(512);
整体流程图
- PoolThreadCache & PoolArena
- PoolThreadCache是线程级别的缓存,先通过缓存MemoryRegionCache进行判断是否已经缓存
- 若MemoryRegionCache中没有缓存,则需要从PoolArena中申请
- 注意:PoolArena的申请是存在多线程竞争的
- 为了减少资源竞争,默认实现中,PoolThreadCache 和PoolArena的个数是相同且一一对应的;都是CPU核心数*2
PoolThreadCache 思维导图
PoolArena的关键信息
- MemoryRegionCache
- 主要的信息有:
- 一个
Queue<Entry>用于保存当前规格的所有对象 SizeClass:尺寸大小- 用于表示一个MemoryRegionCache对象保存多大SizeClass的内存对象,一共有Queue.size个缓存对象
- PoolChunkList
- PoolChunkList是一个双向链表的数据结构
- 每个PoolChunk 也都是一个双向链表,所以只要堆外内存不被撑爆,理论上可以一直递增
- PoolChunkList中的PoolChunk都是动态维护,动态变化的
- 比如:原本分配内存只占用40%的PoolChunk,他是属于q025的PoolChunkList,但是一旦他被分配一块内存后,分配内存占用达到60%,此时就需要将这个PoolChunk移动到q050的PoolChunkList中
PoolChunk中内存管理二叉树
- 如何进行内存管理?
- 引入depthMap和MemoryMap
- 两者都是用于保存当前二叉树中的所在层的编号(0-11)
- depthMap : 用于记录当前节点的高度,一旦初始化,就不在变化;主要用于索引
- memoryMap :用于记录当前节点内存使用情况,时刻变化
- 内存申请使用的流程:
- 关键点:
- memoryMap所构成的二叉树中的每个节点都代表一块内存
- 每次申请都是拿memoryMap的一个节点的内存;而不是拿多个节点
- 根节点所代表的内存值是16M, 叶子结点代表的内存值是8k
- memoryMap构成的满二叉树中,若分配过,父节点是两个节点的最大值;(因为代表可分配内存的最大值)
PoolChunk关键信息
可以参看:
整体类图
源码实现
内存管理的代码太多了;找一些关键、精妙的地方解释一下;
这里另写几篇文章介绍吧;(后续会陆续补充)
- Recycler组件?
- PoolArena申请内存的细节分享
- MemoryRegionCache里面的小技巧
- PoolSubpage的源码解析&思考
4.1.112 Final版本内存管理
整体思维导图
4.1.112版本 VS 4.1.38版本的变化点
- 去掉了Tiny这种内存规格;减少内存碎片化
- 新增当前Small的规格范围,由之前的[512B,4k] -> [16B-28KB]
- 内部是实现方式也发生变化,之前是通过
memoryMap/treeMap
进行标记,寻址;现在变成了
runAvail[]
数组的方式进行寻址;内存管理效率也有所提升 - 为了节省内存,线程级别的缓存默认不开启,同时为了减少内存浪费,ChunkSize的大小默认从16M --> 4M
学习&思考
- 从4.1.38--> 4.1.112的版本演化过程中,可以看到针对过度设计的优化(去掉Tiny、默认关闭线程级缓存、减少PoolChunk的大小)等,所以我们在设计的时候,除了很常见的SOLID原则外,可以多考虑考虑KISS、YAGNI等
- 空间换时间,利用一次申请大内存(16M),缓存形成一个内存管理单元,每次从单元中拿取指定大小内存;
- 规则化,正则化;这其实日常我们说的,没有规矩不成方圆;如果没有这些规则,那管理起来会非常复杂;大家一旦形成默认共识并遵守,事情做起来就会极其通畅;
参考资料
- 谈一谈 Netty 的内存管理 —— 且看 Netty 如何实现 Java 版的 Jemalloc
- Netty Release Notes
热门推荐
痛风能喝羊肉汤吗
中医古方治疗糖尿病:从传统智慧到现代应用
五点支撑法和小燕飞:腰椎膨出患者的康复利器
值得反复品味的20部经典动漫,总有一部触动你
赛罗奥特曼官宣女友,新女奥设计细节曝光
儿童牙齿变黑,竟是因为吃了这些!
儿童牙齿黑渍怎么办?这些方法帮你轻松应对
儿童牙齿变黑,背后隐藏哪些健康隐患?
边塞江南 多彩花城:国家历史文化名城伊宁掠影
河南省肿瘤医院推荐:甲状腺癌术后复查攻略
芹菜胡萝卜大蒜:降压界的三大神器
夏裕医生推荐:三款降压蔬菜,稳住血压不是梦
十字花科蔬菜和芹菜:降压界的双雄?
甲流阳性率攀升至99%,这些防护措施请收好
辽阳白塔vs广佑寺:历史遗迹与现代建筑的双重选择
掌握高抛低吸策略,震荡市中灵活获利
高抛低吸新玩法:三种实用技巧助你稳定盈利
2025年股市震荡开局,高抛低吸需技术心态双管齐下
高抛低吸四大操作法:股市精准买卖技巧详解
53岁陈建斌试水RAP,新作引发千万热议
家居风水大解析:科学布局,迎接幸福生活
游戏记忆法,让你秒变乘法口诀达人
寒假亲子互动:一起背诵乘法口诀
赵梓玥教你韵律朗诵乘法口诀
乘法口诀记忆大赛:谁是故事王?
校园流感高发,这些药物社区医生都在用
杨莉霞教你如何识别肺结核症状
羽绒服选购指南:从专业指标到实用技巧,教你买到保暖又舒适的
六味地黄丸浓缩丸:滋阴补肾效果好,但这些人慎用
从泥土到奇迹:兵马俑制作工艺详解