Windows 10上的WPF应用程序中的内存泄漏

时间:2016-11-15 10:24:38

标签: c# wpf memory-management memory-leaks windows-10

有一个拥有数十万条C#线的大型企业WPF应用程序。我最近被分配到了它。该应用程序也使用(最新版本)第三方组件(众所周知的第三方组件提供商,我不想列出它们)。

仅对某些合作伙伴发生内存泄漏。他们在早上启动应用程序并使用它几个小时才能完全占用内存并最终变慢,他们必须重新启动它(每天几次)。他们有Windows 10机器(但这可能没有意义)。我无法重现泄漏。

合作伙伴允许我发布应用程序的特殊版本,但不允许使用内存配置文件(他们希望使用该应用程序进行生产,而附加的Profiler会降低它的速度)。所以我的想法是:让我们发布一个记录所有内容的特殊版本,包括用户点击和处理"可疑" GC根源。正如我所说,我不知道我必须调试的代码,因此我使用内存分析器确定了可能泄漏的GC根。 (是的,我制作了可能的罪魁祸首清单,例如依赖属性,静态列表等,但到目前为止还没有运气。正如我所说,我不太了解源代码,但是我已经知道了。访问它并可以修改它的任何部分。)

我实际上正在编写一个编程问题:除了用户行为和访问静态变量之外,我应该记录什么?也许我应该在每次用户操作后记录空闲内存。什么是适合的.NET方法?

合作伙伴会在重新启动应用之前复制并发送日志文件。

1 个答案:

答案 0 :(得分:6)

我想在此强调几点,以便您选择正确的曲目。

  1. 如果内存泄漏非常不可能,那么Windows 10就是特定的 问题。你应该能够重现同样的问题 开发PC。

  2. 内存泄漏(及原因)并不容易通过写入来跟踪     日志。你需要知道这种增长究竟是什么     实例。

  3. 我会在本地(在您的开发者电脑中)使用适当的内存分析工具(例如:ANTS Memory profiler)并尝试重现         问题。

  4. 您不需要对代码库有很好的理解来检测内存泄漏。检测泄漏并找到根本原因是这里80%的任务。如果您知道哪些对象正在生长以及哪些对象正在保持它,那么修复它可能并不那么困难。

    基本上你需要做的是。

    • 获取一个好的内存分析器(您可以使用试用版)。
    • 查找客户经常使用的区域/功能。
    • 运行应用程序并获取基本内存快照。
    • 执行相同的功能几次并拍摄另一张内存快照。将快照与基本快照进行比较,看看内存中是否有任何增长的实例。您应该能够看到对象保留图,其中显示了对于那些不断增长的实体,如果有的话,它们会保留什么。
    • 当您拍摄内存快照时,通常会执行内存分析器 GC。从内存中收集并清除所有不必要的实例。因此,您不需要进行任何代码更改,以便测试应用程序是否存在内存泄漏。
    • 一次测试一项功能。