我有出現內存泄漏一個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