malloc_stats---檢查記憶體洩露的神器
轉自:http://m.blog.csdn.net/blog/hust_wusen/8781680
在之前的部落格中提到過,valgrind可以用來檢測記憶體洩露,但在使用中,往往會遇到一些問題,給除錯工作帶來很多不必要的麻煩,我自己遇到的有以下兩種:
(1)記憶體洩露誤檢(系統初始化時,可能有一些需要長期儲存在記憶體中的資料結構,這些空間是永遠不釋放的,而這些記憶體會被認為絕對洩露)
(2) valgrind檢查記憶體洩露過於全面,執行後的結果太多往往很難從中找到有用的資訊。有時候,我們只需要關注某些函式,可能在執行某個操作,呼叫某些函式時會出現記憶體洩露,此時,valgrind的工作顯得冗餘而複雜
系統庫函式中提供了malloc_stats()函式,可以統計本程式具體的記憶體使用情況,精確到位元組,malloc_stats()函式宣告如下:
#include<stdlib.h>
void malloc_stats(void);
malloc_stats()執行結果如下:
Arena 0://第一個arena(每個執行緒分配一個arena),這裡只有一個執行緒
system bytes = 135168//本執行緒從作業系統獲得的動態記憶體,這裡是132KB
in use bytes = 1152//本執行緒在使用的動態記憶體,1152位元組
Total (incl. mmap)://總的使用情況,各個執行緒使用動態記憶體的累加值
system bytes = 135168//本程式從作業系統獲得的動態記憶體,這裡是132KB
in use bytes = 1152//本程式在使用的動態記憶體,1152位元組
max mmap regions = 0//當一次申請記憶體超過128KB(32位作業系統)或1MB(64位作業系統)時,會增加mmap區域,這裡統計使用mmap區域的個數
max mmap bytes = 0//mmap區域對應記憶體大小
不說廢話,來段程式碼看看效果
//test_malloc_stats.c
#include<stdio.h>
#include<stdlib.h>
int func1();
int main()
{
char *p=NULL;
p=(char *)malloc(100);
if(!p){
printf("In main ,malloc fail\n");
return -1;
}
printf("********before call func1 **********\n");
malloc_stats();//在要執行記憶體檢測的函式之前列印記憶體資訊
func1();
printf("\n@@@@@@@@after call func1 @@@@@@@@@@@\n");
malloc_stats();//在要執行記憶體檢測的函式之後列印記憶體資訊
free(p);
return 1;
}
int func1(void)//申請1024位元組,但沒有釋放,有記憶體洩露
{
char *p=NULL;
p=(char *)malloc(1024);//func1函式申請1024位元組
if(!p)
{
printf("Malloc error\n");
}
return 0;
}
如上程式碼,編譯(gcc
test_malloc_stats.c ),執行(./a.out),結果如下如上圖,在呼叫func1之前,記憶體使用位112B,呼叫之後,記憶體使用1152B,增加了1040位元組,說明函式func1存在記憶體洩露,此時檢查func1函式程式碼即可。如果func1確實會造成1040B的記憶體使用,這就說明func1沒有問題。
這裡,您可能會發現申請了1024位元組,實際記憶體佔用1040位元組,這正是glib庫的實現,另外的16位元組用來管理分配的資料塊
相關文章
- java中如何檢視記憶體洩露Java記憶體洩露
- SHBrowseForFolder 記憶體洩露記憶體洩露
- C程式記憶體洩露檢測工具——ValgrindC程式記憶體洩露
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- 如何檢查Javascript中的記憶體洩漏JavaScript記憶體
- Lowmemorykiller記憶體洩露分析記憶體洩露
- [翻譯]查詢Windows記憶體洩露的幾種方法Windows記憶體洩露
- 轉載 ]查詢Windows記憶體洩露的幾種方法Windows記憶體洩露
- ArkTS 的記憶體快照與記憶體洩露除錯記憶體洩露除錯
- 使用 mtrace 分析 “記憶體洩露”記憶體洩露
- 實戰Go記憶體洩露Go記憶體洩露
- Android 記憶體洩露詳解Android記憶體洩露
- android Handler導致的記憶體洩露Android記憶體洩露
- Linux記憶體洩露案例分析和記憶體管理分享Linux記憶體洩露
- nodejs爬蟲記憶體洩露排查NodeJS爬蟲記憶體洩露
- Pprof定位Go程式記憶體洩露Go記憶體洩露
- 簡單的記憶體“洩露”和“溢位”記憶體
- JAVA記憶體洩露的原因及解決Java記憶體洩露
- Python實現記憶體洩露排查的示例Python記憶體洩露
- win10驅動記憶體洩露如何解決_win10記憶體洩露處理方法Win10記憶體洩露
- netty 堆外記憶體洩露排查盛宴Netty記憶體洩露
- 乾貨分享:淺談記憶體洩露記憶體洩露
- 解決git記憶體洩露問題Git記憶體洩露
- Spring Boot heapdump洩露記憶體分析方法Spring Boot記憶體
- 線上記憶體洩露定位--memleak工具記憶體洩露
- 解Bug之路-記一次JVM堆外記憶體洩露Bug的查詢JVM記憶體洩露
- iOS檢測記憶體洩漏iOS記憶體
- 記一次"記憶體洩露"排查過程記憶體洩露
- 一個 Vue 頁面的記憶體洩露分析Vue記憶體洩露
- 一個Vue頁面的記憶體洩露分析Vue記憶體洩露
- Android效能最佳化之記憶體洩露Android記憶體洩露
- 小題大做 | Handler記憶體洩露全面分析記憶體洩露
- 案例:隱秘而低調的記憶體洩露(OOM)記憶體洩露OOM
- 經驗之談:記憶體洩露的原因以及分析記憶體洩露
- 記一次 .NET 某工控軟體 記憶體洩露分析記憶體洩露
- 記憶體檢查指令碼記憶體指令碼
- ThreadLocal原始碼解讀和記憶體洩露分析thread原始碼記憶體洩露
- 使用mtrace追蹤JVM堆外記憶體洩露JVM記憶體洩露
- 一次Kafka記憶體洩露排查經過Kafka記憶體洩露