追踪WPF中的内存泄漏

3

背景: 我们正在构建一个快速交付WPF应用程序的框架。该框架使用Autofac作为IoC容器,并使用来自Prism v1的区域。我们使用Microsoft的Parallel扩展调度任务。

我们面临以下问题: 当我们使用空视图(只有包含区域和占位符控件的外壳)启动应用程序时,内存将保持稳定约60秒,之后每秒增加4kb,然后4kb,之后8kb。因此,每3秒我们的内存压力增加16Kb。

我们尝试了以下方法来追踪泄漏: 我最初使用dotTrace,但是我无法看到两个快照之间30分钟的任何差异。 转而使用.NET内存分析器,因为它可以提供更多信息,但是我们仍然无法看到两个快照之间的任何差异。 我们可以看到创建了一些对象,但它们也被删除了,结果是0的增量。 所以我转向windbg,但结果是相同的。

另一个奇怪的事情是,当我们启动sysinternals dbgvw时,我们不会在我们的应用程序中看到任何调用。

您有任何建议吗?我们下一步应该尝试找出罪魁祸首是谁/是什么?


你使用了哪个指标来确定内存增加了? - Kent Boogaart
我同意你需要定义用于测量内存使用的度量标准,同时你确定了分配是受管理还是不受管理的吗? - morechilli
我查看了进程的堆内存和私有字节。在 Perfmon 中快速查看告诉我,非托管内存正在大量增加,而托管内存只偶尔增加(大约每分钟增加一次),增加的字节数非常少。非托管内存增长更快。 通过 sysinternals 的 Process Explorer 和任务管理器判断内存是否增长。 我们的应用程序有很多跟踪语句,因此我们相当确定运行的不是应用程序代码。 - Casual Jim
我会使用Sysinternals的Process Explorer或Handles.exe对它进行查看。看看是否有任何系统句柄泄露以及它们的类型是什么(如果你有Windows 7,则内置的Resource Explorer具有此信息)。你所描述的行为与我最近在其中一个应用程序中看到的句柄泄漏一致。 - Anderson Imes
2个回答

0

如果您正在寻找未经管理的泄漏,并且正在使用Visual Studio,则可以使用内置的crt函数获得令人惊讶的有用信息:

请参见相关问题的答案


-1

事实证明,这是WPF内部的一个错误,解决方法是创建一个窗口处理程序作为第一个对象或其他什么东西。

谢谢大家


你能否分享一下你在哪里找到这些信息,让其他人也受益?从你的评论中并不清楚解决方法是什么。我的直觉告诉我,你可能是在STA线程中运行WCF服务器,导致无法完成某些资源的释放,但这并不确定。 - Anderson Imes
很遗憾,那是一个wpf的入门问题,网络上找不到相关信息。我们向微软提交了支持请求,并花费了大约一周的时间来追踪问题所在。我现在已经离开了那个客户端,所以无法查看解决方法了。顺便提一下,WCF是IIS托管的,但与该问题无关。 - Casual Jim
这实际上已经在下面的博客文章中记录了,它是第8个(如果在XP上销毁初始HWND,则CMilChannel泄漏)。 http://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx - Casual Jim

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