2012-06-15 91 views
1

我有一個用VC++ MFC 6.0編寫的應用程序。最近通過在vs2008中編譯升級到.NET 3.5,並通過使用託管和非託管環境向其添加了一些WPF應用程序。基本上在win32窗口上託管WPF。如果我只是打開一個WPF應用程序窗口,內存不斷上升,如1KB/10秒。我已經嘗試使用.NET內存分析器&螞蟻內存分析器。但兩者都不能幫助我檢測泄漏!我已經從託管的WPF應用程序中刪除了所有的WPF控件。它只包含一個只有一個框架的頁面。但仍然發生泄漏!有人會幫助我什麼可能導致應用程序內存上升?檢測混合環境中的內存泄漏(託管非託管)

+0

您是否在您的應用中使用了帶有OnPaint方法的WPF工具? – gahcep

+0

不能給你的問題一個具體的答案,但我只想指出一個很好的文章關於追蹤.Net中的內存泄漏:http://www.codeproject.com/Articles/19490/Memory-Leak-Detection-in- NET –

+0

gahcep, 沒有OnPaint() – Alerter

回答

5

首先,你應該確定是否有管理的內存泄漏或本機內存泄漏:

使用這些PerfMon計數器來做到這一點:

  1. 進程/ Private字節,
  2. .NET所有堆中的CLR內存/#字節數,
  3. .NET CLR LocksAndThreads /當前邏輯線程數量。

如果1增加,但2保持穩定,則表明本機存在內存泄漏。 如果1和2增加,則說明存在受管內存泄漏。

如果3意外增加,線程堆棧正在泄漏。

如果您發現託管內存泄漏,.NET內存分析器工具(如Ants,YourKit等)應該有所幫助。由於他們沒有幫助你的情況,你可能有一個本地泄漏。

重要提示:請務必在查看內存消耗之前手動調用垃圾回收器。如果沒有足夠的內存壓力,GC將不會這樣運行,您的進程的內存增加(這是不是在這種特殊情況下的泄漏。)調用GC:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
1

本文介紹的一些常見原因與WPF內存問題 - 可能是值得考慮的讀取:

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/learning-memory-management/WPF-Silverlight-pitfalls

關於你試圖找到內存分析器泄漏,嘗試用螞蟻如下:

1)取兩個快照一分鐘兩個分開分析器會在每次拍攝快照之前自動運行垃圾收集)。

2)確保基準快照被設置爲快照1和最後的快照被設置爲快照2.

3)轉到類列表。

4)在'基本過濾器'下選擇'從當前快照只顯示新對象'。

5)突出顯示最大的類,然後轉到實例列表。

6)對於其中一個實例,打開實例保留圖,顯示將該實例存儲在內存中的引用鏈。

7)有一點運氣,你會看到一個對象,它堅持一些你不能修復的東西。如果不是,重複步驟5 & 6,但選擇不同的類/實例。