我正在解决我们在.NET WinForms应用程序中遇到的一些内存问题。我正在使用SciTech's .NET Memory Profiler以及dotTrace,它们似乎都在.NET Framework控件中指示静态事件处理程序的根分配。从谷歌到处,我发现了这个here和here的报告,但这似乎是在.NET Framework的v1.1上报告的,并且修复了2.0的承诺。我们正在运行2.0,我们仍然看到这些问题。我发现的前25位内存违规者都指向这些静态事件处理程序,特别是SystemEvents.UserPreferenceChanged。 This guy竭尽全力找到解开这些处理程序的方法。我还没有尝试过这个,但我确实尝试了微软支持服务单中提到的解决方法,但没有一个能为我工作。
我很清楚事件处理程序(特别是长寿命静态处理程序)的泄漏可能性,但这个几乎不受我的控制。有人有这方面的经验吗?
答案 0 :(得分:1)
对于CLR中真正深度的内存泄漏问题,我发现最好的工具是windbg。如果你能够通过神秘的语法,它是一个非常有效的调试器和泄漏跟踪器。缺点是使用起来不太直观,学习曲线非常陡峭。
学习windbg的最好方法是做。以下是一些关于使用windbg来追踪泄漏的文章。
答案 1 :(得分:0)
我不知道WinDBG是否会在这里提供帮助。听起来这确实是框架中的一个错误。有没有办法发布简单的复制品?如果是这样,那么我可以深入了解到底发生了什么,看看是否有解决方法。否则,最好的办法就是在Connect开一张票。他们非常善于回归人们。
如果您确实希望使用WinDBG进行调查,可以调查堆上的内容以查看正在发生的事情。开始查看悬挂在哪些物体的根源。我的猜测是你会看到你在上面的剖析器中看到的内容。 WinDBG的棘手之处在于它可以告诉你任何你想要的东西 - 你必须知道你想要回答的问题。