我曾多次成功使用WinDbg来追踪和修复内存泄漏(或者更准确地说CLR无法收集已释放的对象),但是我遇到了一个特定的控件。控件显示在子窗口内,当窗口关闭时,对控件的引用仍然存在,不能进行垃圾回收。我已经解决了我认为可能导致泄漏的大多数问题,但受影响对象的!gcroot(至少对我来说)还不清楚仍然坚持这个对象。无论子窗口中显示的内容如何,输出始终相同:
DOMAIN(03FB7238):HANDLE(固定):79b12f8:Root:06704260(System.Object []) - >
05719f00(System.Collections.Generic.Dictionary 2[[System.IntPtr, mscorlib],[System.Object, mscorlib]])->
067c1310(System.Collections.Generic.Dictionary
2 + Entry [[System.IntPtr,mscorlib],[System.Object,mscorlib]] []) - >
064d42b0(System.Windows.Controls.Grid) - >
064d4314(System.Collections.Generic.Dictionary 2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
064d4360(System.Collections.Generic.Dictionary
2 + Entry [[MS.Internal.IManagedPeerBase,System.Windows],[System.Object,mscorlib]] []) - >
064d3860(System.Windows.Controls.Border) - >
064d4218(System.Collections.Generic.Dictionary 2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
064d4264(System.Collections.Generic.Dictionary
2 + Entry [[MS.Internal.IManagedPeerBase,System.Windows],[System.Object,mscorlib]] []) - >
064d3bfc(System.Windows.Controls.ContentPresenter) - >
064d3d64(System.Collections.Generic.Dictionary 2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
064d3db0(System.Collections.Generic.Dictionary
2 + Entry [[MS.Internal.IManagedPeerBase,System.Windows],[System.Object,mscorlib]] []) - >
064d3dec(System.Collections.Generic.Dictionary 2[[System.UInt32, mscorlib],[System.Windows.DependencyObject, System.Windows]])->
064d3e38(System.Collections.Generic.Dictionary
2 + Entry [[System.UInt32,mscorlib],[System.Windows.DependencyObject,System.Windows]] []) - >
06490b04(Insurer.Analytics.SharedResources.Controls.HistoricalKPIViewerControl)
如果有人对可能存在的问题有任何想法,或者您需要更多信息,请告知我们。
亲切的问候, 克里斯
答案 0 :(得分:1)
静态通过固定Object[]
存储,因此它可以是IntPtr
字典的静态引用,Object
生根。你可以尝试查看字典,看看其他条目是否提供了任何有用的线索。
但是,考虑到IntPtr
,我希望这是Silverlight运行时内部使用的东西。
我会查看根目录并查找应用程序使用的任何类型,并验证它们都没问题。