C# Windows 10上WPF应用程序内存泄漏

C# Windows 10上WPF应用程序内存泄漏,c#,wpf,memory-management,memory-leaks,windows-10,C#,Wpf,Memory Management,Memory Leaks,Windows 10,有一个大的商业WPF应用程序,有几十万条C代码。我最近被派去了。该应用程序使用最新版本的第三方组件以及知名的第三方组件提供商,我不想列出它们 内存泄漏仅针对某些合作伙伴发生。他们早上启动应用程序,并使用几个小时,直到它完全消耗内存,最终变得如此缓慢,以至于他们每天必须重新启动几次。他们有Windows 10计算机,但这可能没有意义。我方不可能重现泄漏情况 合作伙伴允许我发布应用程序的特殊版本,但不允许内存探查器。他们希望将应用程序用于生产,连接的探查器会降低速度。所以我的想法是:让我们发布一个特

有一个大的商业WPF应用程序,有几十万条C代码。我最近被派去了。该应用程序使用最新版本的第三方组件以及知名的第三方组件提供商,我不想列出它们

内存泄漏仅针对某些合作伙伴发生。他们早上启动应用程序,并使用几个小时,直到它完全消耗内存,最终变得如此缓慢,以至于他们每天必须重新启动几次。他们有Windows 10计算机,但这可能没有意义。我方不可能重现泄漏情况

合作伙伴允许我发布应用程序的特殊版本,但不允许内存探查器。他们希望将应用程序用于生产,连接的探查器会降低速度。所以我的想法是:让我们发布一个特殊版本,记录所有内容,包括用户的点击和可疑GC根的处理。正如我所说的,我不知道我必须调试的代码,所以我用内存分析器确定了可能泄漏的GC根。是的,我做了一份可能的罪魁祸首清单,如依赖属性、静态列表等,但到目前为止没有运气。正如我所说,我对源代码了解不够,但我可以访问它,并且可以修改它的任何部分

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


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

我想在此强调几点,供您选择正确的轨道

如果内存泄漏的可能性很小,那是windows 10特有的 问题您应该能够在您的计算机中复制相同的问题 开发PC

内存泄漏及其原因不是很容易通过写来跟踪的 日志。你需要知道到底是什么让你保持这种增长 实例

我会使用一个合适的内存分析工具,例如:在您的开发pc中本地,并尝试复制 问题

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

基本上你需要做的是

获得一个好的内存分析器,你可以使用试用版。 查找客户经常使用的区域/功能。 运行应用程序并获取基本内存快照。 执行相同的功能几次,然后拍摄另一个内存快照。将快照与基本快照进行比较,查看内存中是否有任何不断增长的实例。您应该能够看到对象保留图,该图显示了那些不断增长的实例(如果有的话)所保留的内容。 拍摄内存快照时,通常会执行内存探查器 收集并清除内存中所有不必要的实例。因此,测试应用程序的内存泄漏不需要任何代码更改。 一次测试一个功能。
我正在将我的应用程序与。用户可以设置复选框以启用/禁用分析。似乎只有性能分析,而不是内存分析。我认为最好的办法不是记录所有内容,而是在应用程序运行缓慢时收集内存转储。然后让客户机将内存转储传递给您并对其进行分析。@Evk:有API方法吗?合作伙伴在IT方面不是很有能力,他们希望在分析或记录过程中正常使用应用程序。因此,他们可以找到日志txt文件,但无法创建转储。他们也不想打电话给我来创建内存转储。另一个问题:应用程序的某些部分编写得不太好,所以在我自己的测试中内存有时会增长很多,但几分钟后,一个大的GC发生,一切都恢复正常。不是在他们的机器上…您可以使用windows任务管理器右键单击进程获取转储,然后选择获取转储。您的合作伙伴可以在应用程序变慢到要重新启动时执行此操作。如果这对他们来说太复杂了,你可以在你的应用程序中添加一个按钮,他们可以点击这个按钮来完成。@Evk:谢谢。这是否是.NET特定/托管内存探查器也能理解的转储?或者只是一个完全土生土长的垃圾场?我很高兴知道。许多合作伙伴都使用此功能,而泄漏只发生在少数合作伙伴身上,他们似乎拥有Win10。他们使用与其他应用程序相同的功能。但我同意。他们遇到泄漏可能是因为他们更频繁地使用相同的功能,并且泄漏可能也存在于其他人身上,他们只是没有注意到。我明白。实际上,日志将有助于再现客户的实际行为。从他们的屏幕录音中,我试图复制它,但似乎没有明显的泄漏发生。尽管如此,我还是会用一个 匿名保留图。