Gperftools中tcmalloc的簡介和使用 內存泄露


http://blog.csdn.net/fan_hai_ping/article/details/7978712

http://blog.csdn.net/littletigerat/article/details/7739082

 

 

TcMalloc(Thread-CachingMalloc)是google-perftools工具中的一個內存管理庫,與標准的glibc庫中malloc相比,TcMalloc在內存分配的效率和速度上要高很多,可以提升高並發情況下的性能,降低系統的負載。
Google-perftools項目的網址為:http://code.google.com/p/google-perftools/,該項目包括TcMalloc、heap-checker、heap-profiler和cpu-profiler共4個組件。在只使用TcMalloc情況下可以不編譯其他三個組件。
注:使用線程內存池的方法,在小對象是在內存池中進行分配,使用分配較多的內存空間來優化分配時間。
實現原理請參考網址http://goog-perftools.sourceforge.net/doc/tcmalloc.html

簡介

TcMalloc是一個由Google開發的,比glibc的malloc更快的內存管理庫。通常情況下ptmalloc2能在300ns執行一個malloc和free對,而TcMalloc能在50ns內執行一個malloc和free對。
TcMalloc可以減少多線程程序之間的鎖爭用問題,在小對象上能達到零爭用。
TcMalloc為每個線程單獨分配一個線程本地的Cache,少量的地址分配就直接從Cache中分配,並且定期做垃圾回收,將線程本地Cache中的空閑內存返回給全局控制堆。
TcMalloc認為小於(<=)32K為小對象,大對象直接從全局控制堆上以頁(4K)為單位進行分配,也就是說大對象總是頁對齊的。
TcMalloc中一個頁可以存入一些相同大小的小對象,小對象從本地內存鏈表中分配,大對象從中心內存堆中分配

安裝

Linux下tcmalloc的安裝過程如下:
1)  從Google源代碼網址上下載源代碼包,現在最新版本為2.0;
2)  解壓縮源代碼包
# unzip gperftools-2.0.zip          或
# tar zxvf gperftools-2.0.tar.gz
3)  編譯動態庫
# cd gperftools-2.0
# ./ configure  --disable-cpu-profiler --disable-heap-profiler--disable-heap-checker 
--disable-debugalloc--enable-minimal
加入上面的參數是為了只生成tcmalloc_minimal動態庫,如果需要所有組件,命令如下:
# ./configure
# ./configure -h           用於查看編譯選項。
編譯和安裝:
# make&& make install
使用最小安裝時把tcmalloc_minimal的動態庫拷貝到系統目錄中:
# cplib/tcmalloc_minimal.so.0.0.0 /usr/local/lib
創建軟連接指向tcmalloc:
# ls –s /usr/local/lib/libtcmalloc_minimal.so.0.0.0/usr/local/lib/libtcmalloc.so
啟動程序之前,預先加載tcmalloc動態庫的環境變量設置:
# exportLD_PRELOAD=”/usr/local/lib/libtcmalloc.so
使用losf檢查程序是否已經加載tcmalloc庫:
# lsof -n | grep tcmalloc
在Linux下使用的tcmalloc安裝完成,在Windows下使用VS(2003以上版本)打開工程項目gperftools.sln進行編譯。

使用

將libtcmalloc.so/libtcmalloc.a鏈接到程序中,或者設置LD_PRELOAD=libtcmalloc.so。這樣就可以使用tcmalloc庫中的函數替換掉操作系統的malloc、free、realloc、strdup內存管理函數。
可以設置環境變量設置如下:
         TCMALLOC_DEBUG=<level>       調試級別,取值為1-2
         MALLOCSTATS=<level>                    設置顯示內存使用狀態級別,取值為1-2
         HEAPPROFILE=<pre>                     指定內存泄露檢查的數據導出文件
         HEAPCHECK=<type>                        堆檢查類型,type=normal/strict/draconian

TcMalloc庫還可以進行內存泄露的檢查,使用這個功能有兩種方法:
1)將tcmalloc庫鏈接到程序中,注意應該將tcmalloc庫最后鏈接到程序中;
2)設置LD_PRELOAD=”libtcmalloc.so”/HEAPCHECK=normal,這樣就不需重新編譯程序
打開檢查功能,有兩種方式可以開啟泄露檢查功能:
1)  使用環境變量,對整個程序進行檢查: HEAPCHECK=normal /bin/ls
2)  在源代碼中插入檢查點,這樣可以控制只檢查程序的某些部分,代碼如下:
HeapProfileLeakCheckerchecker("foo");        // 開始檢查
Foo();                                                                         // 需要檢查的部分
assert(checker.NoLeaks());                                 // 結束檢查

調用checker建立一個內存快照,在調用checker.NoLeaks建立另一個快照,然后進行比較,如果內存有增長或者任意變化,NoLeaks函數返回false,並輸出一個信息告訴你如何使用pprof工具來分析具體的內存泄露。
    執行內存檢查:
         #LD_PRELOAD=libtcmalloc.so HEAPCHECK=strict HEAPPROFILE=memtm ./a.out

執行完成后會輸出檢查的結果,如果有泄露,pprof會輸出泄露多少個字節,有多少次分配,也會輸出詳細的列表指出在什么地方分配和分配多少次。
         比較兩個快照:
         #pprof --base=profile.0001.heap 程序名 profile.0002.heap
    已知內存泄漏時,關閉內存泄露檢查的代碼:
void *mark =HeapLeakChecker::GetDisableChecksStart();
<leaky code>           //不做泄漏檢查的部分
HeapLeakChecker::DisableChecksToHereFrom(mark);
         注:在某些libc中程序可能要關閉檢查才能正常工作。
         注:不能檢查數組刪除的內存泄露,比如:char *str = new char[100]; delete str;。


=================================安裝缺少庫============================

libunwind庫為基於64位CPU和操作系統的程序提供了基本的堆棧輾轉開解功能,其中包括用於輸出堆棧跟蹤的API、用於以編程方式輾轉開解堆棧的API以及支持C++異常處理機制的API。

64位操作系統一定要先裝libunwind這個庫。

wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz

tar zxvf libunwind-1.1.tar.gz
cd libunwind-1.1
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM