我们一直在进行大量内存泄漏分析,发现影响因素之一是未删除事件上的委托,导致对象无法足够快地被 GC(有时甚至永远)。

有人知道如何在 FXCop 中编写规则以确保我们将委托从处理程序中删除吗?

我刚刚看到 因此我会在那里询问更多信息。

有帮助吗?

解决方案

好的,除了实施实际检查的问题(在我看来,这与 路径覆盖 因此不实用) - 这是编写新 FxCop 规则的方法:

起初一些对我有帮助的文章:

实施一个简单的规则没什么大不了的。在您的项目中,您需要一个 Rules.xml 文件作为嵌入资源(请参阅 这里)。你的班级来自 BaseIntrospectionRule 并将代码添加到 Check() 方法中:

public override ProblemCollection Check( TypeNode typeNode )
{
  if( type.IsPublic )
  {
    Problems.Add( new Problem( ... ) );
  }
  return Problems;
}

我以前做过几次。我希望它仍然像描述的那样工作:)

其他提示

您需要更具体。你并不需要检查所有的事件代表们退订,因为在通常情况下用户生活更短的寿命比出版商。当你的订户似乎是较长的寿命比出版商内存泄漏只发生,因此存在一个引用,它防止从GC收集发布对象。

现在我们需要验证,如果你订阅了相对较短的活物上的一个事件,你从它最终退订

这是启发式我可以在这种情况下想出:分析所有局部变量的对象(由当前码块范围的{})和所有对象,显式进行处理。有关这些对象的每一个事件算你订阅他们的次数和取消订阅次数。如果第一个数字是大于发出警告。

当然,这并不覆盖所有的情况,但我想没有静态方法可以覆盖所有的情况下,在这个问题上,你需要一些方法就足够了。

我就不提了动态分析的优势,这里的代码审查,因为它是一个单独的话题,没有涉及到这个问题。

您可以强制所有事件订阅应通过在WeakReferences处理规则?我想这应该是更容易比有分析程序的实际流量来实现。

它是安全的假设执行处理程序无论如何都引用回用事件对象的对象?如果是这样的话你就要去找出如何打破这一循环的另一种方式更好。

我们也有类似的对ASP.NET页面事件处理事情而回的东西。该实施处理的对象也不得不把页面的引用。打破尽可能多的联系architectually,因为我们可以之后,还剩下几个旁白改为在WeakReferences。没有更多的内存问题!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top