C# ContextMenuScript 导致 .Net Framework 中的 GCHandle 泄漏和内存泄漏

C# ContextMenuScript cause GCHandle leak and Memory Leak in .Net Framework

提问人:Atlas Liu 提问时间:11/13/2023 更新时间:11/13/2023 访问量:23

问:

我在 .net framework 4.8 中开发了一个应用程序,它可以通过命令一次又一次地显示、切换和关闭不同的 .net 显示器,显示器内部有许多控件,我无法将它们保存在内存中,因为它太多了(取决于用户要求,许多> 5,000 个显示器,1000,000 个 .net 控件),所以我必须使用“new”和“Dispose”。切换一段时间后,我们发现内存泄漏,尤其是性能监视器中的 GCHandle 泄漏。

在此处输入图像描述

用WinDBG调试,发现System.WeakReference是泄漏的,长时间停止切换,然后在WinDBG中打印WeakReference的句柄值,都是null。 注意:我已经调用了 dispose,比如 b.ContextMenuScript = c; 我已经打过电话了:

b.ContextMenuScript = null;
... // clear all event bind what I binded, clear all children in menu
c.Parent = null;
c.Dispose();
c = null;

我现在能做些什么来修复此异常? 或者 Microsoft 是否提供了一些文档来描述它,做某事,或者它是未知的问题?

我已经从父级远程了 ContextMenuScript,并调用了它的 Dispose 方法,它仍然泄漏。我知道它可能保存在系统中的静态对象中,但是如何删除它,以及如何减少 GCHandle?

C# 内存 net-4.8 contextmenustrip 句柄泄漏

评论

0赞 JonasH 11/13/2023
首先,使用真正的内存分析器。这应该确保在捕获任何快照以及差异快照之前运行 GC,并显示对象的保留图。查找内存泄漏是一项相当多的侦查工作,如果没有实际的最小可重现示例,就不太可能提供任何帮助。但你可能做错了什么。在这一点上,.Net 框架本身应该经过相当好的测试。
0赞 Atlas Liu 11/16/2023
感谢您的反馈,我已经找到了解决此问题的方法。取消 ContextMenuStript 与 UI 的绑定,只有在用户在运行时单击鼠标右键时才创建和弹出菜单,GCHandle 将不再泄漏。

答: 暂无答案