jemalloc是如何工作的?有什么好处?

Alb*_*ert 62 malloc firefox

Firefox 3附带了一个新的分配器:jemalloc.

我在几个地方听说过这个新的分配器更好.谷歌的最高结果虽然没有提供任何进一步的信息,但我对其运作方式感兴趣.

pax*_*blo 103

jemalloc首次出现在FreeBSD上,这是一个"Jason Evans"的心血结晶,因此就是"je".如果我没有写过一个名为paxos:-) 的操作系统,我会嘲笑他是自负的

有关详细信息,请参阅此PDF.这是一份白皮书,详细描述了算法的工作原理.

主要的好处是多处理器和多线程系统的可扩展性,部分是通过使用多个竞技场(从中进行分配的原始内存块)实现的.

在单线程情况下,多个竞技场没有真正的好处,因此使用单个竞技场.

但是,在多线程情况下,创建了许多竞技场(是处理器数量的四倍),并且线程以循环方式分配给这些竞技场.

这意味着可以减少锁争用,因为虽然多个线程可以调用malloc或free同时调用,但只有当它们共享相同的竞技场时它们才会竞争.具有不同竞技场的两个线程不会相互影响.

此外,jemalloc尝试优化缓存局部性,因为从RAM中获取数据的行为比使用CPU缓存中已有的数据要慢得多(概念上与从RAM快速获取到从磁盘缓慢获取之间的差异没有什么不同).为此,它首先尝试最小化整体内存使用,因为这更有可能确保应用程序的整个工作集在缓存中.

并且,在无法实现的情况下,它会尝试确保分配是连续的,因为分配在一起的内存往往会一起使用.

从白皮书中,这些策略似乎与当前用于单线程使用的最佳算法具有相似的性能,同时提供了对多线程使用的改进.


Alb*_*ert 11

有一个有趣的来源:C源本身:http: //mxr.mozilla.org/mozilla-central/source/memory/mozjemalloc/jemalloc.c

最初,简短的摘要描述了它的工作原理.但是,缺少更深入的算法分析.


Nic*_*lay 7

至于jemalloc给mozilla带来了什么好处,参见http://blog.pavlov.net/2008/03/11/firefox-3-memory-usage/(也是mozilla+jemalloc的第一个谷歌结果):

[...]得出的结论是,在长时间运行后,jemalloc 给我们带来了最少的碎片量。[...] 我们在 Windows Vista 上的自动化测试显示,当我们打开 jemalloc 时,内存使用量下降了 22% 。