我有一個用VC++ MFC 6.0編寫的應用程序。最近通過在vs2008中編譯升級到.NET 3.5,並通過使用託管和非託管環境向其添加了一些WPF應用程序。基本上在win32窗口上託管WPF。如果我只是打開一個WPF應用程序窗口,內存不斷上升,如1KB/10秒。我已經嘗試使用.NET內存分析器&螞蟻內存分析器。但兩者都不能幫助我檢測泄漏!我已經從託管的WPF應用程序中刪除了所有的WPF控件。它只包含一個只有一個框架的頁面。但仍然發生泄漏!有人會幫助我什麼可能導致應用程序內存上升?檢測混合環境中的內存泄漏(託管非託管)
1
A
回答
1
那麼,經過一些靈魂搜索,發現泄漏實際上是由於框架中的錯誤。 瞭解更多 http://social.msdn.microsoft.com/Forums/zh/wpf/thread/5b9ae245-9067-4ca4-b846-180db9f7bde5
5
首先,你應該確定是否有管理的內存泄漏或本機內存泄漏:
使用這些PerfMon計數器來做到這一點:
- 進程/ Private字節,
- .NET所有堆中的CLR內存/#字節數,
- .NET CLR LocksAndThreads /當前邏輯線程數量。
如果1增加,但2保持穩定,則表明本機存在內存泄漏。 如果1和2增加,則說明存在受管內存泄漏。
如果3意外增加,線程堆棧正在泄漏。
如果您發現託管內存泄漏,.NET內存分析器工具(如Ants,YourKit等)應該有所幫助。由於他們沒有幫助你的情況,你可能有一個本地泄漏。
重要提示:請務必在查看內存消耗之前手動調用垃圾回收器。如果沒有足夠的內存壓力,GC將不會這樣運行,您的進程的內存增加(這是不是在這種特殊情況下的泄漏。)調用GC:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
1
本文介紹的一些常見原因與WPF內存問題 - 可能是值得考慮的讀取:
關於你試圖找到內存分析器泄漏,嘗試用螞蟻如下:
1)取兩個快照一分鐘兩個分開分析器會在每次拍攝快照之前自動運行垃圾收集)。
2)確保基準快照被設置爲快照1和最後的快照被設置爲快照2.
3)轉到類列表。
4)在'基本過濾器'下選擇'從當前快照只顯示新對象'。
5)突出顯示最大的類,然後轉到實例列表。
6)對於其中一個實例,打開實例保留圖,顯示將該實例存儲在內存中的引用鏈。
7)有一點運氣,你會看到一個對象,它堅持一些你不能修復的東西。如果不是,重複步驟5 & 6,但選擇不同的類/實例。
相關問題
- 1. 非託管內存泄漏
- 2. 檢測託管應用程序中的非託管內存泄漏
- 3. 非託管內存泄漏dynavis
- 4. 託管+非託管應用程序導致內存泄漏
- 5. 混合託管/非託管C++?
- 6. 非託管內存和託管存儲
- 7. 混合.NET開發環境中的非託管x64程序集
- 8. 如何在.NET中研究非託管內存泄漏?
- 9. 在.NET中查找非託管內存泄漏應用程序
- 10. 工具檢測內存泄漏爲C#和非託管C++應用
- 11. 允許託管環境中的託管代碼回撥非託管代碼
- 12. C++/cli中的觀察者模式混合託管/非託管
- 13. D中的非託管內存管理
- 14. 。混合託管和非託管代碼的問題
- 15. 如何在C++/CLI中混合使用混合類型(託管和非託管)?
- 16. 用於查找/避免託管代碼中的非託管泄漏的技術
- 17. 「分析器圖」中的「非託管內存」。這是內存泄漏指示嗎?
- 18. 在非託管環境中休眠
- 19. 混合託管和非託管C++代碼?
- 20. WinDbg - 調試混合x64託管/非託管代碼
- 21. 更改託管代碼中非託管代碼的內存值
- 22. 託管C#中的自由非託管C代碼內存
- 23. 請用例子說明託管代碼中的內存泄漏?
- 24. 託管在非節點環境
- 25. 託管和非託管堆
- 26. 託管vs非託管
- 27. DirectX託管或非託管?
- 28. 安全的託管環境
- 29. 無法檢測到.NET中的非託管內存分配
- 30. DebugBreak的行爲在非託管和混合(非託管+託管)應用程序之間有所不同?
您是否在您的應用中使用了帶有OnPaint方法的WPF工具? – gahcep
不能給你的問題一個具體的答案,但我只想指出一個很好的文章關於追蹤.Net中的內存泄漏:http://www.codeproject.com/Articles/19490/Memory-Leak-Detection-in- NET –
gahcep, 沒有OnPaint() – Alerter