有一个拥有数十万条C#线的大型企业WPF应用程序。我最近被分配到了它。该应用程序也使用(最新版本)第三方组件(众所周知的第三方组件提供商,我不想列出它们)。
仅对某些合作伙伴发生内存泄漏。他们在早上启动应用程序并使用它几个小时才能完全占用内存并最终变慢,他们必须重新启动它(每天几次)。他们有Windows 10机器(但这可能没有意义)。我无法重现泄漏。
合作伙伴允许我发布应用程序的特殊版本,但不允许使用内存配置文件(他们希望使用该应用程序进行生产,而附加的Profiler会降低它的速度)。所以我的想法是:让我们发布一个记录所有内容的特殊版本,包括用户点击和处理"可疑" GC根源。正如我所说,我不知道我必须调试的代码,因此我使用内存分析器确定了可能泄漏的GC根。 (是的,我制作了可能的罪魁祸首清单,例如依赖属性,静态列表等,但到目前为止还没有运气。正如我所说,我不太了解源代码,但是我已经知道了。访问它并可以修改它的任何部分。)
我实际上正在编写一个编程问题:除了用户行为和访问静态变量之外,我应该记录什么?也许我应该在每次用户操作后记录空闲内存。什么是适合的.NET方法?
合作伙伴会在重新启动应用之前复制并发送日志文件。
答案 0 :(得分:6)
我想在此强调几点,以便您选择正确的曲目。
如果内存泄漏非常不可能,那么Windows 10就是特定的 问题。你应该能够重现同样的问题 开发PC。
内存泄漏(及原因)并不容易通过写入来跟踪 日志。你需要知道这种增长究竟是什么 实例。
我会在本地(在您的开发者电脑中)使用适当的内存分析工具(例如:ANTS Memory profiler)并尝试重现 问题。
您不需要对代码库有很好的理解来检测内存泄漏。检测泄漏并找到根本原因是这里80%的任务。如果您知道哪些对象正在生长以及哪些对象正在保持它,那么修复它可能并不那么困难。
基本上你需要做的是。