From: https://blog.intzero.net/tools/jemalloc.html
Jemalloc だけでなく、共通のmallocを達成するために、だけでなく、メモリ分析と監視/トーン優秀のためにそれを使用。
Jemallocここでは、メモリリークを検出する方法について説明します。そして、とLD_PRELOAD
のmallocメモリにjemalloc、および管理をするように、環境変数、実行可能プログラムに埋め込まれたソースコードライブラリのjemallocである必要はありません。つまり、各malloc関数/新しいプログラムを呼び出すときに、実際の呼び出しは、実装にjemallocの関数です。
インストール
以下からのリリースでは、 jemalloc最新バージョンを取得します。
参考: https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md
cd ~/jemalloc_test
wget https://github.com/jemalloc/jemalloc/releases/download/5.1.0/jemalloc-5.1.0.tar.bz2
tar zxvf jemalloc-5.1.0.tar.bz2
cd jemalloc-5.1.0
./configure --prefix=/home/intzero/jemalloc_test/jemalloc_install # 我这里装在自己目录下 make make install export PATH=/home/intzero/jemalloc_test/jemalloc_install/bin:$PATH
入門
参考: https://github.com/jemalloc/jemalloc/wiki/Getting-Started
あなたのプログラムに統合jemallocする方法はいくつかあります。
- 一つは、コードをビルドする際に埋め込まれている、ソースコード内のコードjemalloc添加されます。
- もう一つは、使用され
LD_PRELOAD
、環境変数、実行中のプログラムに組み込むことができ、それは、ソースコードを必要としません。
また、あなたはできる MALLOC_CONF
jemalloc環境変数を調整すること。
デモテストを書きます。
V Mankchpp
#include <stdlib.h>
#include <iostream> #include <jemalloc/jemalloc.h> using namespace std; void do_something(size_t i) { // Leak some memory. int *p = new int[i]; // or malloc(i * 4); } int main(int argc, char **argv) { for (size_t i = 1; i <= 1000; i++) { do_something(i); } cout << "jemalloc test." << endl; // Dump allocator statistics to stderr. malloc_stats_print(NULL, NULL, NULL); return 0; }
実行します。
$ g++ main.cpp -o main -I`jemalloc-config --includedir` -L`jemalloc-config --libdir` -Wl,-rpath,`jemalloc-config --libdir` -ljemalloc `jemalloc-config --libs` $ ./main
メモリは、プリントアウトした情報を見ることができます。
リークチェック
V Mankchpp
#include <stdlib.h>
#include <iostream> using namespace std; void do_something(size_t i) { // Leak some memory. int *p = new int[i]; // or malloc(i * 4); } int main(int argc, char **argv) { for (size_t i = 1; i <= 1000; i++) { do_something(i); } cout << "jemalloc test." << endl; return 0; }
実行します。
$ g++ main.cpp -o main
$ MALLOC_CONF=prof_leak:true,lg_prof_sample:0,prof_final:true LD_PRELOAD=/home/intzero/jemalloc_test/jemalloc_install/lib/libjemalloc.so.2 ./main
上記のコマンドが実行され./main
、およびjemallocの事前にロードされます。
プログラムが終了した後、それが似て生成されます。jeprof.37252.0.f.heap
詳細を表示するファイルを:
$ jeprof --show_bytes `which ./main` jeprof.37252.0.f.heap Using local file jeprof.37252.0.f.heap. Welcome to jeprof! For help, type 'help'. (jeprof) top Total: 2173680 B 2173680 100.0% 100.0% 2173680 100.0% 0x00007f8f2f7d7ac0 0 0.0% 100.0% 2173680 100.0% 0x00007f8f2e5b1b13 0 0.0% 100.0% 2173680 100.0% 0x00007f8f2f788581 0 0.0% 100.0% 2173680 100.0% 0x00007f8f2f7e93a0 0 0.0% 100.0% 2173680 100.0% _start 0 0.0% 100.0% 2173680 100.0% do_something 0 0.0% 100.0% 2173680 100.0% main (jeprof)
また、PDFファイルのコールグラフを生成できます。
jeprof --show_bytes --pdf `which ./main` jeprof.37252.0.f.heap > w.pdf