有一个拥有数十万C#行的大型商业WPF应用程序。我最近被分配给它。该应用程序还使用(最新版本的)第三方组件(知名的第三方组件提供商,我不想列出它们)。Windows 10上的WPF应用程序中的内存泄漏
内存泄漏只发生在某些合作伙伴。他们在早上启动应用程序,并在完全吃完内存之前使用它几个小时,最终变得非常慢,以至于不得不重新启动它(每天几次)。他们有Windows 10机器(但这可能没有意义)。我无法重现我身边的泄漏。
合作伙伴允许我发布特殊版本的应用程序,但不允许使用Memory Profiler(他们希望使用该应用程序进行制作,并且所连接的Profiler会降低速度)。所以我的想法是:让我们发布一个特殊版本,记录所有内容,包括用户点击和处理“可疑”GC根。正如我所说,我不知道我必须调试的代码,所以我用内存分析器识别了可能泄漏的GC根。 (是的,我列出了可能的罪魁祸首,如依赖属性,静态列表等,但目前还没有运气。正如我所说的,我不太了解源代码,但我可以访问它,可以修改它的任何部分。)
我实际上正在编写一个编程问题:除了用户行为和访问静态变量之外,还应该记录什么?也许我应该在每次用户操作后记录空闲内存。什么是适合.NET的方法?
合作伙伴在重新启动应用程序之前会复制并发送日志文件。
我发货我用[dotTrace的 “自我分析” API]申请(https://www.jetbrains.com/help/profiler/2016.2/Profiling_Guidelines__Advanced_Profiling_Using_dotTrace_API.html)。用户可以设置复选框来启用/禁用性能分析。似乎只有_performance_分析,而不是_memory_分析。 –
我认为最好的办法不是记录所有内容,而是在应用程序变慢时收集内存转储。然后让客户端将该内存转储传递给您并进行分析。 – Evk
@Evk:有没有API方法?这些合作伙伴并不是真正的IT人员,他们希望在进行“分析”或日志记录的同时,使用应用程序正常工作。所以他们可以找到日志txt文件,但不能创建转储。他们也不想叫我来创建一个内存转储。 (其他问题:应用程序的某些部分写得不太好,所以内存有时会在我自己的测试中增长很多,但是过了几分钟后,出现了一个大的GC,一切都恢复正常,不在他们的机器上......) –