[嵌入式系统-252]:内存堆就像一个没有划停车位的大型停车场,而内存池就像根据车辆型号分区且划了停车位的停车场。

张开发
2026/4/14 18:07:12 15 分钟阅读

分享文章

[嵌入式系统-252]:内存堆就像一个没有划停车位的大型停车场,而内存池就像根据车辆型号分区且划了停车位的停车场。
我们可以顺着这个“停车场”比喻把底层的内存原理彻底对应起来️ 1. 内存堆没有划线的“大广场”场景这就是一个巨大的露天广场。随意停车来了一辆法拉利小对象它随便找个空地停下来了一辆加长林肯大对象它也得找空地。离开后的混乱当法拉利开走后留下了一个很小的空位。紧接着来了一辆大巴车虽然广场上所有空位加起来足够停大巴但因为那个空位太小且不规则大巴车根本停不进去。对应的内存原理内存碎片化这就是堆内存最头疼的外部碎片问题。频繁分配和释放不同大小的内存导致堆上留下了许多无法利用的“内存空洞”。分配慢每次停车分配内存管理员操作系统/分配器都要在广场上转悠半天计算哪里能停得下效率很低。 2. 内存池分区且划线的“立体车库”“根据车辆型号分区”正是现代高性能内存池如TCMalloc或Jemalloc的核心算法——分级分配。场景这个停车场被严格规划了。A区微型车位专门停摩托车、自行车比如 16字节的小对象。B区标准车位专门停轿车比如 128字节的对象。C区大型车位专门停卡车。优势极速入库如果要停摩托车管理员直接带你去A区那里全是空位甚至不需要找直接进第一个就行O(1) 时间复杂度。无碎片因为车位是划好线的固定大小块摩托车开走后留下的空位摩托车还能继续用大巴车也不会因为A区有空位而试图挤进去。对应的内存原理固定大小分配内存池将内存切分成固定大小的块Block。空闲链表每个分区维护一个链表记录哪些车位是空的。分配时直接从链表头取一个释放时把头指针指回去速度极快。 总结对比表格特性内存堆 (Heap)内存池 (Pool)你的比喻没划线的广场车随便停走后留坑。划好线的车库按车型分区整齐划一。分配速度慢(需要搜索合适的空隙)。极快(直接去对应分区拿现成的)。内存碎片严重(容易产生无法利用的小空隙)。几乎为零(特别是同类型对象复用)。适用场景通用场景对象大小不可预测。游戏、服务器频繁创建/销毁同类对象。这种“分区划线”的思想就是为了解决堆内存“碎片化”和“分配慢”这两个致命弱点而诞生的。

更多文章