.NET Framework 4.8中ContextMenuScript引发GCHandle及内存泄漏求助
问题:.NET Framework 4.8 大量控件界面切换时的GCHandle/WeakReference内存泄漏
基于.NET Framework 4.8开发了一款应用,核心功能是通过命令反复显示、切换及关闭带有大量控件的不同.NET显示界面。由于界面数量最多可达5000个、控件总量能到100万个,无法将所有界面常驻内存,只能频繁通过new创建实例,用完后调用Dispose释放。
但反复切换操作后,通过性能监视器观察到明显的内存泄漏问题,其中GCHandle泄漏尤为突出。经WinDBG调试进一步定位,发现System.WeakReference出现泄漏,且停止切换操作较长时间后,WinDBG中打印的WeakReference句柄值均为null。
目前已执行以下释放操作:
b.ContextMenuScript = null; ... // 清除所有自行绑定的事件,清除菜单中所有子项 c.Parent = null; c.Dispose(); c = null;
已经将ContextMenuScript从父控件移除并调用其Dispose方法,但泄漏问题依然存在。推测这些WeakReference可能被系统静态对象持有,现在需要解决:
- 如何移除这类被系统静态对象持有的引用,减少GCHandle数量?
- 微软是否有相关文档说明此类问题?
内容的提问来源于stack exchange,提问作者Atlas Liu
相关产品推荐
相关产品推荐

