使用jemalloc时,可以通过profiling机制来发现并定位内存泄漏(memory leak)。本文翻译自原文并增加了一些例子。
1、安装
这里我们编译安装jemalloc.5.10,注意在configure的时候添加了–enable-prof选项,这样才能打开profiling机制。下文中通过MALLOC_CONF设置的参数都依赖于次选项。
wget https://github.com/jemalloc/jemalloc/archive/5.1.0.tar.gz
tar zxvf 5.1.0.tar.gz
cd jemalloc-5.1.0/
./autogen.sh
./configure --prefix=/usr/local/jemalloc-5.1.0 --enable-prof
make
make install
2、程序退出时的内存分配状态
作为最简单的情形,我们可以在程序退出时,查看还有哪些分配但未释放的内存,它们通常是内存泄漏的重要线索。
#include <stdio.h>
#include <stdlib.h>
void do_something(size_t i)
{
// Leak some memory.
malloc(i * 1024);
}
void do_something_else(size_t i)
{
// Leak some memory.
malloc(i * 4096);
}
int main(int argc, char **argv)
{
size_t i, sz;
for (i = 0; i < 80; i++)
{
do_something(i);
}
for (i = 0; i < 40; i++)
{
do_something_else(i);
}
return (0);
}
然后编译。注意:我们的代码里没有include jemalloc的头文件,编译的时候也不需要链接jemalloc库。启动的时候通过LD_PRELOAD
指定jemalloc库的路径就可以了。这是jemalloc方便使用的地方。当然也可以include jemalloc的头文件并链接jemalloc库来使用jemalloc的其他功能(见后文)。
gcc test.c -o a.out
2.1、标题程序退出时的泄漏
MALLOC_CONF=prof_leak:true,lg_prof_sample:0,prof_final:true LD_PRELOAD=/usr/local/jemalloc-5.1.0/lib/libjemalloc.so.2 ./a.out
<jemalloc>: Leak approximation summary: ~6926352 bytes, ~120 objects, >= 2 contexts
<jemalloc>: Run jeprof on "jeprof.34447.0.f.heap" for leak detail
程序退出时报告了泄漏的大概情况,多少自己,多少对象,并产生了一个”jeprof.34447.0.f.hea