jemalloc的使用

来源:互联网 发布:java continue label 编辑:程序博客网 时间:2024/06/06 02:53
1. 概述
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在多处理器下的一个实验


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、使用静态库

如果要使用静态库,在编译jemalloc时,需要重新设置,

./configure --with-jemalloc-prefix

make

jemalloc.h和libjemalloc.a 拷到合适的地方。

此时的jemalloc.h 的宏定义会与之前编译的jemalloc.h有少许的不同。

因为此时 libjemlloc.a 文件中的    malloc  free  realloc   变成了  yesmalloc, yesfree, yesrealloc。这是为了不能与glic中的malloc,free,realloc 重名,否则无法编译通过。

在自己写的程序中,需要将 malloc free realloc 替换成  je_malloc, je_free, je_realloc. (jemalloc.h 会将  je_malloc, je_free, je_realloc. 替换成 yesmalloc, yesfree, yesrealloc)

在编译时,加入-DJEMALLOC_NO_DEMANGLE -static

0 0
原创粉丝点击