常見檢測內存泄漏的工具集合

jopen 10年前發布 | 36K 次閱讀 工具

內存泄漏(memory leak),指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。

在編程時進行動態內存分配是非常必要的,它可以在程序運行的過程中幫助分配所需的內存,而不是在進程啟動的時候就進行分配。然而有效地管理這些內存同樣也是非常重要的。

在大型的、復雜的應用程序中,內存泄漏是常見的問題,當以前分配的一片內存不再需要使用或無法訪問時,但是卻并沒有釋放它,那么對于該進程來說,會因此導致總可用內存的減少,這時就出現了內存泄漏。


常見檢測內存泄漏的工具:


C/C++

1.     ValgrindDebugging and profiling Linux programs, aiming at programs written in C and C++.

2.     ccmallocLinuxSolaris下對CC++程序的簡單的使用內存泄漏和malloc調試庫。

3.     LeakTracerLinuxSolarisHP-UX下跟蹤和分析C++程序中的內存泄漏。

4.     Electric FenceLinux分發版中由Bruce Perens編寫的malloc()調試庫。

5.     LeakyLinux下檢測內存泄漏的程序。

6.     DmallocDebug Malloc Library.

7.     MEMWATCH-由Johan Lindh編寫,是一個開放源代碼C語言內存錯誤檢測工具,主要是通過gccprecessor來進行。

8.     KCachegrindA visualization tool for the profiling data generated by Cachegrind and Calltree.

Java

1. Memory Analyzer-是一款開源的JAVA內存分析軟件,查找內存泄漏,能容易找到大塊內存并驗證誰在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下載RCP的獨立版本或者Eclipse的插件。

2. JProbe-分析Java的內存泄漏。

3. JProfiler-一個全功能的Java剖析工具,專用于分析J2SEJ2EE應用程序。它把CPU、執行緒和內存的剖析組合在一個強大的應用中,GUI可以找到效能瓶頸、抓出內存泄漏、并解決執行緒的問題。

4. JRockit-用來診斷Java內存泄漏并指出根本原因,專門針對Intel平臺并得到優化,能在Intel硬件上獲得最高的性能。

5. YourKit  .NET & Java Profiling業界領先的Java.NET程序性能分析工具。

6. AutomatedQA AutomatedQA的獲獎產品performance profilingmemory debugging工具集的下一代替換產品,支持Microsoft, Borland, Intel, Compaq  GNU編譯器。可以為.NETWindows程序生成全面細致的報告,從而幫助您輕松隔離并排除代碼中含有的性能問題和內存/資源泄露問題。支持.Net 1.0,1.1,2.0,3.0Windows 32/64位應用程序。

7. Compuware DevPartner Java Edition-包含Java內存檢測,代碼覆蓋率測試,代碼性能測試,線程死鎖,分布式應用等幾大功能模塊。

.NET

1. .NET Memory Profiler找到內存泄漏并優化內存使用針對C#VB.Net,或其它.Net程序。

2. Windows Leaks Detector-探測任何Win32應用程序中的任何資源泄漏(內存,句柄等),基于Win API調用鉤子。

3. DTrace一款開源動態跟蹤Dynamic Tracing,能在Unix類似平臺運行,用戶能夠動態檢測操作系統內核和用戶進程,以更精確地掌握系統的資源使用狀況,提高系統性能,減少支持成本,并進行有效的調節。

4. IBM Rational PurifyPlus-幫助開發人員查明C/C++、托管.NETJavaVB6代碼中的性能和可靠性錯誤。PurifyPlus 將內存錯誤和泄漏檢測、應用程序性能描述、代碼覆蓋分析等功能組合在一個單一、完整的工具包中。

5. Parasoft Insure++-針對C/C++應用的運行時錯誤自動檢測工具,它能夠自動監測C/C++程序,發現其中存在著的內存破壞、內存泄漏、指針錯誤和I/O等錯誤。并通過使用一系列獨特的技術(SCI技術和變異測試等),徹底的檢查和測試我們的代碼,精確定位錯誤的準確位置并給出詳細的診斷信息。能作為Microsoft Visual C++的一個插件運行。

6. Compuware DevPartner for Visual C++ BoundsChecker Suite-為C++開發者設計的運行錯誤檢測和調試工具軟件。作為Microsoft Visual StudioC++ 6.0的一個插件運行。

7. Electric Software GlowCode-包括內存泄漏檢查,code profiler,函數調用跟蹤等功能。給C++.Net開發者提供完整的錯誤診斷,和運行時性能分析工具包。

 

FireFox / IE

1.  Leak Monitor-一個Firefox擴展,能找出跟Firefox相關的泄漏類型。

2. IE Leak Detector (Drip/IE Sieve)DripIE Sieve leak detectors幫助網頁開發員提升動態網頁性能通過報告可避免的因為IE局限的內存泄漏。

3. 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 Heap64KB);

32位的窗口堆(Windows Heap2MB);

32位的用戶菜單堆(User Menu Heap2MB)。


兩個GDI資源堆分別是:16位的GDI堆(GDI Heap64KB);32位的GDI堆(GDI2MB)。

從這里的系統資源分類和大小我們應該明白,不管CPUP4還是486,內存是8M還是1G,所有Windows的用戶都擁有同樣大小的系統資源(堆),用戶不能自已增加或減少系統資源的大小,這是由操作系統決定的,與硬件檔次沒有任何關系。

WindowsUser資源堆和GDI資源堆的可用(Free)空間稱為可用 User資源和可用GDI資源,Windows中以百分數表示它們,用戶可以選擇 "開始/附件/系統工具/系統信息",來實時查看它們的大小。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!