我有一个用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