linux中記憶體洩漏的檢測(一)最簡單的方法
什麼是記憶體洩漏
記憶體洩漏是指程式動態申請的記憶體在使用完後沒有釋放,導致這段記憶體不能被作業系統回收再利用。
例如這段程式,申請了4個位元組的空間但沒有釋放,有4個位元組的記憶體洩漏。
#include <iostream>
using namespace std;
int main()
{
int *p = new int(1);
cout <<*p<<endl;
return 0
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
隨著時間的推移,洩漏的記憶體越來越多,可用的記憶體越來越少,輕則效能受損,重則系統崩潰。
一般情況下,發生記憶體洩漏時,重啟就可以回收洩漏的記憶體。但是對於Linux,通常跑的是伺服器程式,不可以隨意重啟,在記憶體洩漏問題上就要格外小心。
記憶體洩漏特點
-
難復現 — 要執行到足夠長的時間才會暴露。
-
難定位 — 出錯位置是隨機的,看不出與記憶體洩漏的程式碼有什麼聯絡。
最簡單的方法
為了避免寫出記憶體洩漏的程式,通常會有這樣的程式設計規範,要求我們在寫程式時申請和釋放成對出現的。因為每一次申請都意味著必須有一次釋放與它相對應。
基於這個特點,一種簡單的方法就是在程式碼中統計申請和釋放的次數,如果申請和釋放的數量不同,就認為是記憶體洩漏了。
#include "stdio.h"
#include "stdlib.h"
int malloc_count, free_count;
void * my_malloc(int size)
{
malloc_count++;
return malloc(size);
}
void my_free(void *p)
{
free_count++;
free(p);
}
int main()
{
count = 0;
int *p1 = (int *)my_malloc(sizeif(int))
int *p2 = (int *)my_malloc(sizeif(int))
printf("%d, %d", p1, p2);
my_free(p1);
if(malloc_count != free_count)
printf("memory leak!\n");
return 0
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
方法分析
- 優點:
直觀,容易理解,容易實現
- 缺點:
1.該方法要求執行結束時對執行中產生的列印分析才能知道結果。
2.該方法要求封裝所有申請和釋放空間的函式,並在呼叫的地方修改成呼叫封裝後的函式。雖然C中申請/釋放記憶體介面並不多,但是對於一個大型的專案,呼叫這些介面的地方卻是很多的,要全部替換是一個比較大的工作量。
3.只對C語言適用,不能應用於C++
4.對於所呼叫的庫不適用。如果希望應用於庫,則要修改庫程式碼
5.只能檢測是否洩漏,卻沒有具體資訊,比如洩漏了多少空間
6.不能說明是哪一行程式碼引起了洩漏
改進
這種方法雖然簡單的,卻有許多的不足,無法真正應用於專案中。欲知怎樣改進,且看下回分解。
相關文章
- 如何在 Linux 下檢測記憶體洩漏Linux記憶體
- iOS檢測記憶體洩漏iOS記憶體
- 如何檢查Javascript中的記憶體洩漏JavaScript記憶體
- Node.js 應用的記憶體洩漏問題的檢測方法Node.js記憶體
- Go 記憶體洩漏?不是那麼簡單!Go記憶體
- vue使用中的記憶體洩漏Vue記憶體
- Android中的記憶體洩漏模式Android記憶體模式
- [譯] Swift 中的記憶體洩漏Swift記憶體
- Android記憶體洩漏檢測與修復技巧Android記憶體
- 對於記憶體洩漏問題的簡單認知記憶體
- 記憶體洩漏的原因記憶體
- 如何避免JavaScript中的記憶體洩漏?JavaScript記憶體
- 使用VLD進行記憶體洩漏檢測(release + debug)記憶體
- linux程式之記憶體洩漏分析Linux記憶體
- Android 記憶體洩漏檢測工具 LeakCanary(Kotlin版)的實現原理Android記憶體Kotlin
- WebView引起的記憶體洩漏WebView記憶體
- 簡單VC記憶體檢測記憶體
- 分析記憶體洩漏和goroutine洩漏記憶體Go
- [譯]理解閉包中的記憶體洩漏記憶體
- 翻譯 | 理解Java中的記憶體洩漏Java記憶體
- JavaScript中的垃圾回收和記憶體洩漏JavaScript記憶體
- C++--問題27--如何檢測記憶體洩漏C++記憶體
- Java應用程式中的記憶體洩漏及記憶體管理Java記憶體
- 一次 Java 記憶體洩漏的排查Java記憶體
- 這可能是,Flutter 中最“強悍”的記憶體洩漏檢測方案......Flutter記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- js記憶體洩漏JS記憶體
- Android記憶體洩漏Android記憶體
- Android 記憶體洩漏Android記憶體
- jvm 記憶體洩漏JVM記憶體
- Java記憶體洩漏Java記憶體
- 使用多年的 go pprof 檢查記憶體洩漏的方法居然是錯的?!Go記憶體
- 1.記憶體優化(一)記憶體洩漏記憶體優化
- 【譯】JavaScript的記憶體管理和 4 種處理記憶體洩漏的方法JavaScript記憶體
- 小心遞迴中記憶體洩漏遞迴記憶體
- Android中常見的記憶體洩漏Android記憶體
- Swift的ARC和記憶體洩漏Swift記憶體
- .NET 記憶體洩漏的爭議記憶體
- 定位並修復 Go 中的記憶體洩漏Go記憶體