記憶體洩露檢測工具比較
1. ccmalloc-Linux和Solaris下對C和C++程式的簡單的使用記憶體洩漏和malloc除錯庫。
2. Dmalloc-Debug Malloc Library.
3. Electric Fence-Linux分發版中由Bruce Perens編寫的malloc()除錯庫。
4. Leaky-Linux下檢測記憶體洩漏的程式。
5. LeakTracer-Linux、Solaris和HP-UX下跟蹤和分析C++程式中的記憶體洩漏。
6. MEMWATCH-由Johan Lindh編寫,是一個開放原始碼C語言記憶體錯誤檢測工具,主要是通過gcc的precessor來進行。
7. Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.
8. KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree.
9. Leak Monitor-一個Firefox擴充套件,能找出跟Firefox相關的洩漏型別。
10. IE Leak Detector (Drip/IE Sieve)-Drip和IE Sieve leak detectors幫助網頁開發員提升動態網頁效能通過報告可避免的因為IE侷限的記憶體洩漏。
11. Windows Leaks Detector-探測任何Win32應用程式中的任何資源洩漏(記憶體,控制代碼等),基於Win API呼叫鉤子。
12. SAP Memory Analyzer-是一款開源的JAVA記憶體分析軟體,可用於輔助查詢JAVA程式的記憶體洩漏,能容易找到大塊記憶體並驗證誰在一直佔用它,它是基於Eclipse RCP(Rich Client Platform),可以下載RCP的獨立版本或者Eclipse的外掛。
13. DTrace-即動態跟蹤Dynamic Tracing,是一款開源軟體,能在Unix類似平臺執行,使用者能夠動態檢測作業系統核心和使用者程序,以更精確地掌握系統的資源使用狀況,提高系統性能,減少支援成本,並進行有效的調節。
14. IBM Rational PurifyPlus-幫助開發人員查明C/C++、託管.NET、Java和VB6程式碼中的效能和可靠性錯誤。PurifyPlus 將記憶體錯誤和洩漏檢測、應用程式效能描述、程式碼覆蓋分析等功能組合在一個單一、完整的工具包中。
15. Parasoft Insure++-針對C/C++應用的執行時錯誤自動檢測工具,它能夠自動監測C/C++程式,發現其中存在著的記憶體破壞、記憶體洩漏、指標錯誤和I/O等錯誤。並通過使用一系列獨特的技術(SCI技術和變異測試等),徹底的檢查和測試我們的程式碼,精確定位錯誤的準確位置並給出詳細的診斷資訊。能作為Microsoft Visual C++的一個外掛執行。
16. Compuware DevPartner for Visual C++ BoundsChecker Suite-為C++開發者設計的執行錯誤檢測和除錯工具軟體。作為Microsoft Visual Studio和C++ 6.0的一個外掛執行。
17. Electric Software GlowCode-包括記憶體洩漏檢查,code profiler,函式呼叫跟蹤等功能。給C++和.Net開發者提供完整的錯誤診斷,和執行時效能分析工具包。
18. Compuware DevPartner Java Edition-包含Java記憶體檢測,程式碼覆蓋率測試,程式碼效能測試,執行緒死鎖,分散式應用等幾大功能模組。
19. Quest JProbe-分析Java的記憶體洩漏。
20. ej-technologies JProfiler-一個全功能的Java剖析工具,專用於分析J2SE和J2EE應用程式。它把CPU、執行緒和記憶體的剖析組合在一個強大的應用中。JProfiler可提供許多IDE整合和應用伺服器整合用途。JProfiler直覺式的GUI讓你可以找到效能瓶頸、抓出記憶體洩漏、並解決執行緒的問題。4.3.2註冊碼:A-G666#76114F-1olm9mv1i5uuly#0126
21. BEA JRockit-用來診斷Java記憶體洩漏並指出根本原因,專門針對Intel平臺並得到優化,能在Intel硬體上獲得最高的效能。
22. SciTech Software AB .NET Memory Profiler-找到記憶體洩漏並優化記憶體使用針對C#,VB.Net,或其它.Net程式。
23. YourKit .NET & Java Profiler-業界領先的Java和.NET程式效能分析工具。
24. AutomatedQA AQTime-AutomatedQA的獲獎產品performance profiling和memory debugging工具集的下一代替換產品,支援Microsoft, Borland, Intel, Compaq 和 GNU編譯器。可以為.NET和Windows程式生成全面細緻的報告,從而幫助您輕鬆隔離並排除程式碼中含有的效能問題和記憶體/資源洩露問題。支援.Net 1.0,1.1,2.0,3.0和Windows 32/64位應用程式。
25. JavaScript Memory Leak Detector-微軟全球產品開發歐洲團隊(Global Product Development- Europe team, GPDE) 釋出的一款除錯工具,用來探測JavaScript程式碼中的記憶體洩漏,執行為IE系列的一個外掛。
附錄:記憶體洩漏的發生方式
1. 常發性記憶體洩漏。發生記憶體洩漏的程式碼會被多次執行到,每次被執行的時候都會導致一塊記憶體洩漏。
2. 偶發性記憶體洩漏。發生記憶體洩漏的程式碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測記憶體洩漏至關重要。
3. 一次性記憶體洩漏。發生記憶體洩漏的程式碼只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊且僅有一塊記憶體發生洩漏。
4. 隱 式記憶體洩漏。程式在執行過程中不停的分配記憶體,但是直到結束的時候才釋放記憶體。嚴格的說這裡並沒有發生記憶體洩漏,因為最終程式釋放了所有申請的記憶體。但是 對於一個伺服器程式,需要執行幾天,幾周甚至幾個月,不及時釋放記憶體也可能導致最終耗盡系統的所有記憶體。所以,我們稱這類記憶體洩漏為隱式記憶體洩漏。
什麼是系統資源?
當應用程式在Windows中執行時,Windows必須實時"跟蹤"該應用程式的執行,並保留與之相關的許多資訊,如按鈕、游標、選單的位置和點陣圖、視窗的狀況等,這些資訊由Windows保留在一種叫堆的記憶體塊中,堆的英文為Heap。簡單地說,堆是採用特殊機制管理的記憶體塊。由Windows的一個系統核心User.exe管理的堆叫做User資源堆(User Resource Heap),由另一個系統核心Gdi.exe管理的堆叫做GDI資源堆(Graphical Device Interface Resource Heap,簡稱GDI Resource Heap),User資源堆和GDI資源堆合稱為系統資源堆(System Resource Heap),習慣上就把它們叫做系統資源(System Resource)。
微軟將Windows的系統資源(堆)分為五個堆,其中User資源堆為三個,而GDI資源堆為兩個。
三個User資源堆分別是:16位的使用者堆(User Heap,64KB);32位的視窗堆(Windows Heap,2MB);32位的使用者選單堆(User Menu Heap,2MB)。
兩個GDI資源堆分別是:16位的GDI堆(GDI Heap,64KB);32位的GDI堆(GDI,2MB)。
從這裡的系統資源分類和大小我們應該明白,不管CPU是P4還是486,記憶體是8M還是1G,所有Windows的使用者都擁有同樣大小的系統資源(堆),使用者不能自已增加或減少系統資源的大小,這是由作業系統決定的,與硬體檔次沒有任何關係。
Windows的User資源堆和GDI資源堆的可用(Free)空間稱為可用 User資源和可用GDI資源,Windows中以百分數表示它們,使用者可以選擇 "開始/附件/系統工具/系統資訊",來實時檢視它們的大小。