gpt4 book ai didi

.net - 如何调试 GDI 对象泄漏?

转载 作者:行者123 更新时间:2023-12-04 16:26:20 28 4
gpt4 key购买 nike

我不太确定如何去做。这是一个大型应用程序,我们的大多数表单上都有 GDI 对象“泄漏”。

有工具可以帮忙吗?是否有关于如何使用此类工具的教程?

我应该开始从我们的表单中删除代码,直到我缩小违规者的范围吗? (有很多代码)。

最佳答案

仅 GDI 对象超过 10,000 个对象限制是非常罕见的,当您不自己调用它们的 Dispose() 方法时,垃圾收集器会处理它们。更可能的故障模式是超出窗口的对象限制。这在 Winforms 中很容易做到,Controls.Clear() 或 Controls.Remove() 会在您没有明确处理已删除的控件时让您匆忙到达那里。垃圾收集器无法清理它们。

您可以从 Taskmgr.exe 的“进程”选项卡获得良好的诊断结果。查看 + 选择列并勾选句柄、用户对象和 GDI 对象。在使用过程中观察这些数字。其中一个的数量稳步上升是一个明确的迹象,当它拒绝给你更多时,你会让 Windows 轰炸你的程序。每个的默认配额为 10000。 USER Objects 表示您在 Controls.Clear/Remove 上有问题,GDI Objects 表示您正在泄漏 System.Drawing 对象。 Perfmon.exe 是一个很好的工具,可以查看垃圾收集器的运行频率是否足以释放未处置的 System.Drawing 对象。

众所周知,在需要时显式调用 Dispose() 是一种很好的做法。特别是对于 Image 和 Bitmap 对象,它们占用很少的 GC 内存,但占用大量非托管内存,如果不处理它们,很容易用 OOM 轰炸程序。当心 Properties.Resources 中令人讨厌的陷阱,每次使用它时都会得到一个新对象,并且需要对其进行处理。始终使用 using绘画代码中的语句。

关于.net - 如何调试 GDI 对象泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8302287/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com