我有出现内存泄漏一个WindowsForms应用程序,所以我用展鹏的蚂蚁内存分析器来看看我怀疑的对象,发现他们是由物体在终结队列只开了。太好了,到底什么是Finalizer Queue?你能指出我的最佳定义吗?你能分享任何轶事建议吗?什么是Finalizer队列和Control + ThreadMethodEntry?
此外,Finalizer队列上的所有根GC对象都是实例System.Windows.Forms.Control + ThreadMethodEntry名为“caller”的对象。我发现它涉及到多线程的用户界面交互,但我除此之外不太了解。原谅我表面上的懒惰并承认无知,但这些资源全都埋在供应商的组成部分。我正在与供应商讨论这些问题,但我需要一些方向让我加快谈话速度。你能指出我对ThreadMethodEntry最有用的定义吗?任何轶事建议?
此外,我是否应该关心终结器队列上的这些对象?
更新:这对3210有帮助。
谢谢你的出色答案,保罗。这是我正在谈论的对象引用图,在清理资源之后查看第二个快照中的新对象。图中实现IDisposable的所有对象都有一个工具提示,说“已为此对象调用Dispose()”,但所选对象没有此工具提示。 – flipdoubt 2009-08-12 21:24:54
关于ThreadMethodEntry的注意事项:我认为它们用于UI线程的任何调用。每个Control对象都有一个ThreadMethodEntry类型的线程回调队列。一个回调出队一个ThreadMethodEntry并运行它。 每个ThreadMethodEntry对象都有一堆内部字段。检查这些字段可能会帮助您找出哪些供应商的对象正在调用。我不记得是否可以从ANTS获取这些信息,但我知道你可以通过WinDbg.dll和sos.dll(托管调试器扩展)。看看“方法”委托和“调用者”控件。 – 2009-08-12 22:04:41
另请注意,ThreadMethodEntry对象实现了一个终结器,但它们没有Dispose方法。当他们完成时,他们也会被移动到终结者队列中。 – 2009-08-12 22:05:17