jemalloc起源于Jason Evans 2006年在BSDcan conference发表的论文: A Scalable Concurrent malloc Implementation for FreeBSD
jason认为phkmalloc(FreeBSD’s previous malloc implementation by Kamp (1998))没有考虑多处理器的情况,因此在多线程并发下性能低下(事实如此),而jemalloc适合多线程下内存分配管理。
2. jason在多处理器下的一个实验
![](http://static.oschina.net/uploads/img/201512/23132621_Nh0h.gif)
x轴是线程数,y轴是性能。
在单线程下,彼此相差不多,dlmalloc(Doug Lea’s malloc, been around forever)稍占优势。
在多线程下,dlmalloc和pkgmalloc性能急剧下降,而jemalloc在线程数和处理器数一致的时候,性能达到最高,线程数继续增加能保持稳定。
3. 原理
arena+TLS
arena即小块内存,指将大内存划分成多个小内存来管理
TLS(Thread-local storage),即线程局部缓存
回过头来看看tcmalloc,惊人的一致。
经过测试,tcmalloc和jemalloc在实际应用中不相伯仲,一个比较早的测试结果:
valgrind检测不出tcmalloc和jemalloc的内存泄露,但是tcmalloc有gprof可以使用,还不清楚jemalloc有没有什么可用的检测工具
4. 安装使用(jemalloc当前版本2.2.5)
安装:
wget http://www.canonware.com/download/jemalloc/jemalloc-2.2.5.tar.bz2 .
tar -jxvf jemalloc-2.2.5.tar.bz2
cd jemalloc-2.2.5/ && ./configure && make && make install
ldconfig
使用:链接即可使用
写一个简单的测试程序client.cpp
g++ -o client client.cpp -ljemalloc
使用ldd查看程序所需的共享库
$ ldd client
linux-gate.so.1 => (0x00e18000)
libjemalloc.so.1 => /usr/local/lib/libjemalloc.so.1 (0x00110000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00322000)
libm.so.6 => /lib/libm.so.6 (0x0012d000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x002ed000)
libc.so.6 => /lib/libc.so.6 (0x00153000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0080f000)
libdl.so.2 => /lib/libdl.so.2 (0x0069e000)
/lib/ld-linux.so.2 (0x008ab000)
以上方式是使用动态库,不推荐,更好地方式是使用静态库libjemalloc.a*
5. 其它
还有宣称比tcmalloc和jemalloc更快的内存管理库,eg:nedmalloc,有时间了再做了解~
references:
paper:A Scalable Concurrent malloc Implementation for FreeBSD
www.canonware.com/jemalloc/index.html