在Linux下檢查內存泄露

1.什麼是內存泄露?

內存泄露指的是應用程序在分配某段內存後,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。


2.造成內存泄露的原因是什麼?

一般情況下造成內存泄露的主要原因是,由於程序設計的不合理,未對動態申請的堆空間進行回收,或者只在程序的部分出口對申請的內存空間進行回受,從而導致被某個程序棄用卻不能被其他程序使用的內存越來越多。

3.內存泄露帶來的危害:

內存泄露會減少可用內存的數量從而降低計算機的性能。而且當所消耗的內存達到系統的上限時,程序自己會崩潰,嚴重者甚至會導致系統掛起或崩潰。

4.如何檢測內存泄露?

a.使用相關命令,如ps,top等

源文件如下:

通過分析源程序可以看出,在greeting函數中,當程序向操作系統申請內存後,未對其進行釋放操作後,就直接返回主函數,而且主函數不斷地調用greeting函數,導致內存一直在泄露中
  • 使用ps命令進行分析
          在一個終端中運行程序:


在另一個終端中查看內存狀態:
程序運行前內存狀態:

每隔一段時間檢查一次內存狀態:
通過分析,我們可以看到,program1程序佔用的內存越來越大

  • 使用top命令進行分析
同樣地在一個終端中運行程序,然後在另一個終端中觀察狀態:
通過分析,我們可以看到,program1程序佔用的內存越來越

b.進行靜態分析,如使用工具mtrace

修改源程序: 添加頭文件,並且用mtrace()和muntrace()兩條語句將要檢測內存泄露的代碼塊包含起來
編譯程序並用該環境變量來定義一個文件log用於輸出

運行程序:

log文件分析:

日誌中一連串的"+"號表示程序一直在申請內存空間,(若有“-”號,表示程序在釋放空間)

c.進行動態分析,如如使用valgrind或者memwatch等工具等

將第二步修改的代碼註釋掉:

使用valgrind 命令並運行程序:


查看目錄文件:


日誌中提示有內存塊丟失

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