使用Visual Studio诊断工具来调查内存消耗/泄漏问题

3
在我正在开发的WPF应用程序中,我从Visual Studio诊断工具(见下图)中获得了以下内存使用概况。
因此,我的程序不断分配更多的内存,直到出现OutOfMemoryException。
我对VS诊断工具还很陌生,所以问题是:我如何使用这个窗口或它提供的信息来找出这个内存消耗的罪魁祸首?

enter image description here

2个回答

6
当内存达到可疑的高水平时,您需要暂停调试器,然后使用“Take Snapshot”获取内存分配的快照。然后,您可以分析哪些对象使用了不同数量的内存。
有关使用诊断工具测量内存使用情况的更多详细信息,请参见this link

2
谢谢你的回答!确实,通过执行您的建议,"Memory Diff"视图让我意识到一个昂贵的构造函数无意中被调用在一个紧密循环内。现在我能够修复它,这是远非显而易见的,如果没有诊断工具,将会很难定位! - heltonbiker

2
这也很大程度上取决于你正在做什么,比如你有一个巨大的文件吗?还是有成千上万甚至数百万个更小的对象、文件或图像?
最近我遇到一个高内存使用率的情况是与来自system.graphics的句柄有关。我的句柄数量(任务管理器->性能,系统句柄)和内存都在增长,而且远远超过了应该有的范围。我忘记了每次迭代要处理10个位图。我在这些位图上调用了dispose(),它解决了我的问题。
使用VS的内存快照,您可以拍摄多个快照并进行比较以查看发生了什么变化。我使用任务管理器和VS的托管内存工具一样多。您可以使用任务管理器的-> 进程功能查看正在进行的操作。您可以通过单击“查看” -> “选择列”来添加列,以跟踪对象(例如句柄、线程和GDI对象)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接