分類
以發生的方式來分類,内存洩漏可以分為4類:常發性發生内存洩漏的代碼會被多次執行到,每次被執行的時候都會導緻一塊内存洩漏。偶發性發生内存洩漏的代碼隻有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對于特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測内存洩漏至關重要。一次性發生内存洩漏的代碼隻會被執行一次,或者由于算法上的缺陷,導緻總會有一塊且僅一塊内存發生洩漏。比如,在類的構造函數中分配内存,在析構函數中卻沒有釋放該内存,所以内存洩漏隻會發生一次。
隐式
程序在運行過程中不停的分配内存,但是直到結束的時候才釋放内存。嚴格的說這裡并沒有發生内存洩漏,因為最終程序釋放了所有申請的内存。但是對于一個服務器程序,需要運行幾天、幾周甚至幾個月,不及時釋放内存也可能導緻最終耗盡系統的所有内存。所以,我們稱這類内存洩漏為隐式内存洩漏。
危害
從用戶使用程序的角度來看,内存洩漏本身不會産生什麼危害,作為一般的用戶,根本感覺不到内存洩漏的存在。真正有危害的是内存洩漏的堆積,這會最終消耗盡系統所有的内存。從這個角度來說,一次性内存洩漏并沒有什麼危害,因為它不會堆積,而隐式内存洩漏危害性則非常大,因為較之于常發性和偶發性内存洩漏它更難被檢測到。
表現
cpu資源耗盡:估計是機器沒有反應了,鍵盤,鼠标,以及網絡等等。這個在windows上經常看見,特别是中了毒。進程id耗盡:沒法創建新的進程了,串口或者telnet都沒法創建了。硬盤耗盡:機器要死了,交換内存沒法用,日志也沒法用了,死是很正常的。内存洩漏或者内存耗盡:新的連接無法創建,free的内存比較少。發生内存洩漏的程序很多,但是要想産生一定的後果,就需要這個進程是無限循環的,是個服務進程。當然,内核也是無限循環的,所以,如果内核發生了内存洩漏,情況就更加不妙。内存洩漏是一種很難定位和跟蹤的錯誤,目前還沒看到有什麼好用的工具(當然,用戶空間有一些工具,有靜态分析的,也會動态分析的,但是找内核的内存洩漏,沒有好的開源工具)。内存洩漏和對象的引用計數有很大的關系,再加上c/c++都沒有自動的垃圾回收機制,如果沒有手動釋放内存,問題就會出現。如果要避免這個問題,還是要從代碼上入手,良好的編碼習慣和規範,是避免錯誤的不二法門。一般我們常說的内存洩漏是指堆内存的洩漏。堆内存是指程序從堆中分配的,大小任意的(内存塊的大小可以在程序運行期決定),使用完後必須顯式釋放的内存。應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊内存,使用完後,程序必須負責相應的調用free或delete釋放該内存塊,否則,這塊内存就不能被再次使用,我們就說這塊内存洩漏了。
檢測工具
部分工具n
1.ccmalloc-Linux和Solaris下對C和C++程序的簡單的使用内存洩漏和malloc調試庫。n
2.Dmalloc-Debug Malloc Library.n
3.Electric Fence-Linux分發版中由Bruce Perens編寫的malloc調試庫。n
4.Leaky-Linux下檢測内存洩漏的程序。n
5.LeakTracer-Linux、Solaris和HP-UX下跟蹤和分析C++程序中的内存洩漏。n
6.MEMWATCH-由Johan Lindh編寫,是一個開放源代碼C語言内存錯誤檢測工具,主要是通過gcc的precessor來進行。n
7.Valgrind - Debugging and profiling Linux programs, aiming at programs written in C and C++.n
8.KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree.n
9.IBM Rational PurifyPlus-幫助開發人員查明C/C++、托管.NET、Java和VB6代碼中的性能和可靠性錯誤。PurifyPlus 将内存錯誤和洩漏檢測、應用程序性能描述、代碼覆蓋分析等功能組合在一個單一、完整的工具包中。n
10.ParasoftInsure++-針對C/C++應用的運行時錯誤自動檢測工具,它能夠自動監測C/C++程序,發現其中存在着的内存破壞、内存洩漏、指針錯誤和I/O等錯誤。并通過使用一系列獨特的技術(SCI技術和變異測試等),徹底的檢查和測試我們的代碼,精确定位錯誤的準确位置并給出詳細的診斷信息。能作為MicrosoftVisual C++的一個插件運行。n
11.Compuware DevPartner for Visual C++ BoundsChecker Suite-為C++開發者設計的運行錯誤檢測和調試工具軟件。作為Microsoft Visual Studio和C++ 6.0的一個插件運行。n
12.Electric Software GlowCode-包括内存洩漏檢查,code profiler,函數調用跟蹤等功能。給C++和.Net開發者提供完整的錯誤診斷,和運行時性能分析工具包。n
13.Compuware DevPartner Java Edition-包含Java内存檢測,代碼覆蓋率測試,代碼性能測試,線程死鎖,分布式應用等幾大功能模塊。n
14.Quest JProbe-分析Java的内存洩漏。n
15.ej-technologies JProfiler-一個全功能的Java剖析工具,專用于分析J2SE和J2EE應用程序。它把CPU、執行緒和内存的剖析組合在一個強大的應用中。n
16.BEAJRockit-用來診斷Java内存洩漏并指出根本原因,專門針對Intel平台并得到優化,能在Intel硬件上獲得最高的性能。



















