我发现我的程序在某些时候会出现内存泄漏,为了分析问题,我创建了完整的内存转储(.mdmp)文件,并使用WinDbg进行分析。
造成内存泄漏的主要原因是强句柄。
0:000> !gcroot 02dc02d4
HandleTable:
000b7000 (strong handle)
-> 114e3174 MyApp.Controls.Forms.TransparentOverlappingForm
-> 114e32b8 System.Windows.Forms.PropertyStore
-> 114e39dc System.Windows.Forms.PropertyStore+ObjectEntry[]
-> 02dc03a4 MyApp.Editor.Main.EditorForm
-> 02dc05cc System.ComponentModel.EventHandlerList
-> 114e3884 System.ComponentModel.EventHandlerList+ListEntry
-> 114bef3c System.ComponentModel.EventHandlerList+ListEntry
-> 114bef28 System.ComponentModel.EventHandlerList+ListEntry
-> 02dc0740 System.ComponentModel.EventHandlerList+ListEntry
-> 02dc0630 System.ComponentModel.EventHandlerList+ListEntry
-> 02dc05fc System.ComponentModel.EventHandlerList+ListEntry
-> 02dc05dc System.EventHandler
-> 02dc02d4 MyApp.Editor.Main.EditorLoad
TransparentOverlappingForm是一个悬浮在另一个控件上面的表单,用作控件,完全支持透明度(这是另一种说法)。 它被用作如下:
TransparentOverlappingForm.Show((Control)OverlapsOn);
TransparentOverlappingForm(透明重叠表单)、EditorForm(编辑器表单)和它所覆盖的控件——所有这些都将被关闭(如果是一个表单)并被处理。
有一个泄漏问题,因为TransparentOverlappingForm没有被回收,并且在内部持有对EditorForm的链接。
那么如何查看关于“000b7000(强引用)”的一些信息,以便找出如何GC呢?
我知道GC强引用可以是静态变量,但是如何确定它是一个静态变量,以及它在哪里。