記憶體泄露

記憶體泄露

記憶體泄漏也稱作“存儲滲漏”,用動態存儲分配函式動態開闢的空間,在使用完畢後未釋放,結果導致一直占據該記憶體單元。直到程式結束。(其實說白了就是該記憶體空間使用完畢之後未回收)即所謂記憶體泄漏。記憶體泄漏形象的比喻是作業系統可提供給所有進程的存儲空間正在被某個進程榨乾,最終結果是程式運行時間越長,占用存儲空間越來越多,最終用盡全部存儲空間,整個系統崩潰。由程式申請的一塊記憶體,如果沒有任何一個指針指向它,那么這塊記憶體就會泄漏了。

基本信息

分類

記憶體泄露記憶體泄露
以發生的方式來分類,記憶體泄漏可以分為4類:
常發性
發生記憶體泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊記憶體泄漏。
偶發性
發生記憶體泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測記憶體泄漏至關重要。
一次性
發生記憶體泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊且僅一塊記憶體發生泄漏。比如,在類的構造函式中分配記憶體,在析構函式中卻沒有釋放該記憶體,所以記憶體泄漏只會發生一次。
隱式
程式在運行過程中不停的分配記憶體,但是直到結束的時候才釋放記憶體。嚴格的說這裡並沒有發生記憶體泄漏,因為最終程式釋放了所有申請的記憶體。但是對於一個伺服器程式,需要運行幾天、幾周甚至幾個月,不及時釋放記憶體也可能導致最終耗盡系統的所有記憶體。所以,我們稱這類記憶體泄漏為隱式記憶體泄漏。

危害

從用戶使用程式的角度來看,記憶體泄漏本身不會產生什麼危害,作為一般的用戶,根本感覺不到記憶體泄漏的存在。真正有危害的是記憶體泄漏的堆積,這會最終消耗盡系統所有的記憶體。從這個角度來說,一次性記憶體泄漏並沒有什麼危害,因為它不會堆積,而隱式記憶體泄漏危害性則非常大,因為較之於常發性和偶發性記憶體泄漏它更難被檢測到。

表現

記憶體泄露記憶體泄露
cpu資源耗盡:估計是機器沒有反應了,鍵盤,滑鼠,以及網路等等。這個在windows上經常看見,特別是中了毒。進程id耗盡:沒法創建新的進程了,串口或者telnet都沒法創建了。硬碟耗盡:機器要死了,交換記憶體沒法用,日誌也沒法用了,死是很正常的。記憶體泄漏或者記憶體耗盡:新的連線無法創建,free的記憶體比較少。發生記憶體泄漏的程式很多,但是要想產生一定的後果,就需要這個進程是無限循環的,是個服務進程。當然,核心也是無限循環的,所以,如果核心發生了記憶體泄漏,情況就更加不妙。記憶體泄漏是一種很難定位和跟蹤的錯誤,目前還沒看到有什麼好用的工具(當然,用戶空間有一些工具,有靜態分析的,也會動態分析的,但是找核心的記憶體泄漏,沒有好的開源工具)。記憶體泄漏和對象的引用計數有很大的關係,再加上c/c++都沒有自動的垃圾回收機制,如果沒有手動釋放記憶體,問題就會出現。如果要避免這個問題,還是要從代碼上入手,良好的編碼習慣和規範,是避免錯誤的不二法門。一般我們常說的記憶體泄漏是指堆記憶體的泄漏。堆記憶體是指程式從堆中分配的,大小任意的(記憶體塊的大小可以在程式運行期決定),使用完後必須顯式釋放的記憶體。應用程式一般使用malloc,realloc,new等函式從堆中分配到一塊記憶體,使用完後,程式必須負責相應的調用free或delete釋放該記憶體塊,否則,這塊記憶體就不能被再次使用,我們就說這塊記憶體泄漏了。

檢測工具

記憶體泄露記憶體泄露
部分工具

1.ccmalloc-Linux和Solaris下對C和C++程式的簡單的使用記憶體泄漏和malloc調試庫。
2.Dmalloc-DebugMallocLibrary.
3.ElectricFence-Linux分發版中由BrucePerens編寫的malloc調試庫。
4.Leaky-Linux下檢測記憶體泄漏的程式。
5.LeakTracer-Linux、Solaris和HP-UX下跟蹤和分析C++程式中的記憶體泄漏。
6.MEMWATCH-由JohanLindh編寫,是一個開放原始碼C語言記憶體錯誤檢測工具,主要是通過gcc的precessor來進行。7.Valgrind - DebuggingandprofilingLinuxprograms,aimingatprogramswritteninCandC++.8.KCachegrind-AvisualizationtoolfortheprofilingdatageneratedbyCachegrindandCalltree.
9.IBMRationalPurifyPlus-幫助開發人員查明C/C++、託管.NET、Java和VB6代碼中的性能和可靠性錯誤。PurifyPlus將記憶體錯誤和泄漏檢測、應用程式性能描述、代碼覆蓋分析等功能組合在一個單一、完整的工具包中。
10.ParasoftInsure++-針對C/C++套用的運行時錯誤自動檢測工具,它能夠自動監測C/C++程式,發現其中存在著的記憶體破壞、記憶體泄漏、指針錯誤和I/O等錯誤。並通過使用一系列獨特的技術(SCI技術和變異測試等),徹底的檢查和測試我們的代碼,精確定位錯誤的準確位置並給出詳細的診斷信息。能作為MicrosoftVisualC++的一個外掛程式運行。
11.CompuwareDevPartnerforVisualC++BoundsCheckerSuite-為C++開發者設計的運行錯誤檢測和調試工具軟體。作為MicrosoftVisualStudio和C++6.0的一個外掛程式運行。
12.ElectricSoftwareGlowCode-包括記憶體泄漏檢查,codeprofiler,函式調用跟蹤等功能。給C++和.Net開發者提供完整的錯誤診斷,和運行時性能分析工具包。
13.CompuwareDevPartnerJavaEdition-包含Java記憶體檢測,代碼覆蓋率測試,代碼性能測試,執行緒死鎖,分散式套用等幾大功能模組。
14.QuestJProbe-分析Java的記憶體泄漏。
15.ej-technologiesJProfiler-一個全功能的Java剖析工具,專用於分析J2SE和J2EE應用程式。它把CPU、執行緒和記憶體的剖析組合在一個強大的套用中。
16.BEAJRockit-用來診斷Java記憶體泄漏並指出根本原因,專門針對Intel平台並得到最佳化,能在Intel硬體上獲得最高的性能。

相關搜尋

熱門詞條

聯絡我們