4 个版本 (1 个稳定版)
1.7.9-source | 2023年4月27日 |
---|---|
1.7.6-source | 2022年5月27日 |
1.7.3 |
|
1.7.2 | 2021年8月13日 |
#443 in 内存管理
40,543 每月下载量
用于 30 个 Crates(直接使用 2 个)
460KB
9K SLoC
mi-malloc
- 小巧且一致:该库大约有 8k 行代码,使用简单且一致的数据结构,非常适合集成和适应其他项目。对于运行时系统,它提供了用于单调心跳和延迟释放(对于具有引用计数的有界最坏情况时间)的钩子。
- 空闲列表分片:我们不是有一个大的空闲列表(每个大小类一个),而是每个“mimalloc 页面”有多个较小的列表,这减少了碎片并增加了局部性——在时间上靠近分配的项将在内存中靠近。 (一个 mimalloc 页面包含一个大小类的块,在 64 位系统上通常为 64KiB)。
- 空闲列表多分片:这个大想法!我们不仅按 mimalloc 页面对空闲列表进行分片,而且对每个页我们有多个空闲列表。特别是,有一个列表用于线程局部空闲操作,另一个用于并发空闲操作。现在从另一个线程释放可以是一个单一的 CAS,而无需在线程之间进行复杂的协调。由于将会有数千个独立的空闲列表,竞争自然会分布在堆上,并且在一个位置上竞争的机会将很低——这与像跳表这样的随机化算法非常相似,其中添加一个随机源可以消除更复杂的算法的需求。
- 贪婪页面重置:当一个“页面”变成空(由于空闲列表分片而增加的概率)时,内存被标记为操作系统上的未使用(“重置”或“清除”),减少了(实际)内存压力和碎片,尤其是在长时间运行的程序中。
- 安全:mimalloc可以以安全模式构建,添加保护页、随机分配、加密的空闲列表等,以保护免受各种堆漏洞的侵害。性能惩罚仅在我们基准测试中平均约为3%。
- 一等堆:有效地创建和使用多个堆,以在不同区域中进行分配。可以一次性销毁堆,而不是单独释放每个对象。
- 有界:它不受膨胀问题的影响,具有有界的最坏情况分配时间(wcat),有界空间开销(约0.2%元数据,分配大小最多浪费12.5%),并且仅使用原子操作,没有内部争用点。
- 快速:在我们的基准测试中(见下文),mimalloc优于所有其他领先的分配器(jemalloc、tcmalloc、Hoard等),并且通常使用更少的内存(最坏情况下最多多25%)。一个很好的特性是它在广泛的基准测试中表现一致良好。