什么策略和工具对于在.NET中查找内存泄漏很有用?
我写了C ++ 10年。 我遇到了记忆问题,但是可以通过合理的努力来修复它们。
在过去的几年里,我一直在写C#。 我发现我仍然有很多内存问题。 由于非决定因素,它们很难诊断和修复,并且因为C#的理念是,当你非常确定的时候,你不应该担心这样的事情。
我发现的一个特殊问题是我必须明确地处理和清理代码中的所有内容。 如果我不这样做,那么内存分析器并不会真正起到帮助作用,因为有太多的cha floating声在你尝试向你显示的所有数据中找不到泄漏。 我想知道我是否有错误的想法,或者我得到的工具不是最好的。
什么样的策略和工具对解决.NET中的内存泄漏有用?
当我怀疑内存泄漏时,我使用Scitech的MemProfiler。
到目前为止,我发现它非常可靠和强大。 至少有一次它拯救了我的培根。
GC在.NET IMO中工作得非常好,但就像其他语言或平台一样,如果编写错误的代码,就会发生不好的事情。
只是为了忘记处理问题,请尝试本博客文章中描述的解决方案。 这是本质:
public void Dispose ()
{
// Dispose logic here ...
// It's a bad error if someone forgets to call Dispose,
// so in Debug builds, we put a finalizer in to detect
// the error. If Dispose is called, we suppress the
// finalizer.
#if DEBUG
GC.SuppressFinalize(this);
#endif
}
#if DEBUG
~TimedLock()
{
// If this finalizer runs, someone somewhere failed to
// call Dispose, which means we've failed to leave
// a monitor!
System.Diagnostics.Debug.Fail("Undisposed lock");
}
#endif
我们在我们的项目中使用了Red Gate软件的Ants Profiler Pro。 它适用于所有基于.NET语言的应用程序。
我们发现,.NET垃圾收集器在清理内存中对象时非常“安全”(它应该是这样)。 它会保留对象,因为我们可能会在将来某个时候使用它。 这意味着我们需要更加小心我们在内存中膨胀的对象的数量。 最后,我们将所有数据对象转换为“按需膨胀”(就在请求字段之前),以减少内存开销并提高性能。
编辑:这里是我的意思是“按需膨胀”的进一步解释。 在我们的数据库对象模型中,我们使用父对象的属性来公开子对象。 例如,如果我们有一些记录在一对一的基础上引用了其他“详细信息”或“查找”记录,我们可以这样构造它:
class ParentObject
Private mRelatedObject as New CRelatedObject
public Readonly property RelatedObject() as CRelatedObject
get
mRelatedObject.getWithID(RelatedObjectID)
return mRelatedObject
end get
end property
End class
当内存中有很多记录时,我们发现上述系统造成了一些真实的内存和性能问题。 所以我们切换到了一个系统,在这个系统中,只有在被请求时才对对象进行充气,而数据库调用只在必要时完成:
class ParentObject
Private mRelatedObject as CRelatedObject
Public ReadOnly Property RelatedObject() as CRelatedObject
Get
If mRelatedObject is Nothing
mRelatedObject = New CRelatedObject
End If
If mRelatedObject.isEmptyObject
mRelatedObject.getWithID(RelatedObjectID)
End If
return mRelatedObject
end get
end Property
end class
事实证明,这样做效率更高,因为在需要对象时(Get方法被访问),对象一直处于内存不足的状态。 它在限制数据库命中和内存空间方面获得了巨大的性能提升。
链接地址: http://www.djcxy.com/p/57031.html上一篇: What strategies and tools are useful for finding memory leaks in .NET?