-內存泄露初探-

某次面試,被問及內存泄露相關事宜,當時瞠目結舌,故現對此話題比較敏感。

(1)WHAT 什麼是內存泄露?

 部分內存不在程序的管理範圍內了,即脫離了管理。

(2)WHY 內存泄露是怎麼產生的?

調用malloc分配內存之後,忘記調用相應的free函數釋放它。從而導致廢棄內存越來越多,從而可能導致程序或系統崩潰。

(一種解決的簡單方法就是使用 alloca 函數來代替 malloc 分配內存,但由於alloca()的生命期只在所調用函數內部,所以當離開調用 alloca 的函數時,它所分配的內存會被自動釋放。因此,這並不適用於那些比創建它們/的函數生命期更長的結構。另外可能還有一個可移植性的問題)

(3)HOW 如何檢測內存泄露?

觀察內存泄露是一個兩步驟地過程。首先,使用 swap 命令觀察還有多少可用的交換空間:

/usr/sbin/swap -s

total: 17228k bytes allocated + 5396K reserved = 22624K used, 29548K available

在一兩分鐘內鍵入該命令三到四次,看看可用的交換區是否在減少。還可以使用其他一些 /usr/bin/*stat 工具 如

netstat, vmstat 等。如果發現不斷有內存被分配且從不釋放,一個可能的解釋就是有個進程出現了內存泄露。

(Redhat Linux 下實際使用:swap命令未發現,netstat命令產生的結果太過複雜,使用 vmstat 命令可以很方便的查出內存使用情況!)

第二個步驟就是確定可疑的進程,看看它是不是該爲內存泄露負責。你可能已經知道哪個進程是罪魁禍首,不然可以使用“pa -lu 用戶名”命令來顯示所有進程的大小,如下所示:

F  S UID PID .....
................

標題爲SZ的列就是以頁面數表示的進程的大小(如果一定想知道以KB表示的頁面的大小,可以使用 pagesize 命令)。同樣數次重複這個命令,可以發現任何動態分配內存的進程的大小都在增長。如果一個進程看上去不斷地增長而從不縮小,它就有可能出現了內存泄露。一個非常悲哀的現實是,管理動態內存是一項非常困難的編程任務。有些公共領域的X-Windows應用程序因內存泄露而臭名昭著,就像Apple Computer的董事會一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章