【问题标题】:Memory leak in WPF app on Windows 10Windows 10 上的 WPF 应用程序中的内存泄漏
【发布时间】:2017-03-29 04:35:53
【问题描述】:

有一个包含数十万 C# 行的大型商业 WPF 应用程序。我最近被分配到它。该应用程序还使用(最新版本的)第三方组件(知名的第 3 方组件提供商,我不想列出它们)。

内存泄漏仅发生在某些合作伙伴身上。他们在早上启动应用程序并使用它几个小时,然后它会完全消耗内存并最终变得如此缓慢,以至于他们必须重新启动它(每天几次)。他们有 Windows 10 机器(但这可能没有意义)。无法重现我这边的泄漏。

合作伙伴允许我发布该应用的特殊版本,但不允许使用内存分析器(他们想将该应用用于生产,而附加的分析器会减慢它的速度)。所以我的想法是:让我们发布一个记录所有内容的特殊版本,包括用户点击和“可疑”GC 根的处理。正如我所说,我不知道我必须调试的代码,所以我用内存分析器确定了潜在的泄漏 GC 根。 (是的,我列出了可能的罪魁祸首,例如依赖属性、静态列表等,但到目前为止还没有运气。正如我所说,我不太了解源代码,但我可以访问它并且可以修改它的任何部分。)

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

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

【问题讨论】:

  • 我正在使用"Self-profiling" API of dotTrace 发送我的应用程序。用户可以设置一个复选框来启用/禁用分析。似乎只有 performance 分析,而不是 memory 分析。
  • 我认为最好的办法不是记录所有内容,而是在应用程序运行缓慢时收集内存转储。然后让客户端将该内存转储传递给您并进行分析。
  • @Evk:有 API 方法吗?合作伙伴在 IT 方面并不真正胜任,​​他们希望在“分析”或日志记录过程中使用该应用程序进行正常工作。所以他们可以找到日志 txt 文件,但不能创建转储。他们也不想叫我来创建内存转储。 (其他问题:应用程序的某些部分写得不太好,所以在我自己的测试中,内存有时会增长很多,但几分钟后,发生了一次大 GC,一切又好了。不在他们的机器上......)
  • 您可以使用 Windows 任务管理器获取转储(右键单击进程,选择转储)。当应用程序变慢到要重新启动它的程度时,您的合作伙伴可以这样做。如果这对他们来说太复杂了,您可以在您的应用程序中添加一个按钮,他们可以单击该按钮来执行此操作。
  • @Evk:谢谢。这会是 .NET 特定/托管内存分析器也能理解的转储吗?还是只是一个完全原生的转储?

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


【解决方案1】:

我想在这里强调几点,以便您选择正确的轨道。

  1. 如果内存泄漏不太可能是 Windows 10 特定的 问题。您应该能够在您的 开发PC。

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

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

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

基本上你需要做的是。

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

【讨论】:

  • 1) 很高兴知道。许多合作伙伴都在使用它,并且泄漏仅发生在少数似乎拥有 Win10 的合作伙伴身上。他们使用与其他应用程序相同的功能。但我同意。他们经历泄漏可能是因为他们更频繁地使用相同的功能(并且泄漏可能也存在于其他人身上,他们只是没有注意到)。 2) 我明白了。实际上,日志将有助于重现客户实际所做的事情。从他们的屏幕录像中,我试图重现它,但似乎没有发生明显的泄漏。尽管如此,我将使用匿名保留图更新我的初始帖子。
猜你喜欢
  • 2010-11-27
  • 2011-03-21
  • 2016-01-29
  • 2012-04-30
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多