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

Tho*_*alc 2 c# wpf memory-leaks memory-management windows-10

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

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

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

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

合作伙伴将在重新启动应用程序之前复制并发送日志文件.

Cha*_*thJ 6

我想在此强调一些要点,以便您选择正确的曲目.

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

  2. 通过写日志来记忆内存泄漏(以及原因)并不容易.您需要知道这些不断增长的实例究竟是什么.

  3. 我会在本地(在您的开发人员中)使用适当的内存分析工具(例如:ANTS内存分析器)并尝试重现该问题.

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

基本上你需要做的是.

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