0

我希望有人可以提供帮助!

我们有一个相当大的 VB.Net MDI 应用程序,它是从 VB6 转换而来的。当它第一次在没有打开 MDIChild 表单的情况下运行时,它使用了大约 35,000K。随着越来越多的表单打开(但未关闭),内存使用量(根据任务管理器)以每个表单大约 4,000K 的速度攀升。(我知道 TM 只显示为应用程序分配的内存,而不是实际使用的内存。)

问题是,当分配的内存达到某个点时,这取决于目标机器上的可用内存,在一个或多个打开的表单关闭之前,无法打开更多表单。可以打开的表单数量的“限制”似乎取决于机器的可用内存。

例如: - 在整个机器只有 512M 的虚拟机上,它似乎是大约 7-8 个表格,当这种情况发生时,分配的内存大约是 80,000K。- 在我们的终端服务器机器上,它有 3GB 并且还运行各种其他口渴的应用程序,它停止在大约 20 多个表单和大约 100,000 - 105,000K 的内存分配。

我尝试使用 perfmon 来查看是否存在泄漏,这表明使用稳定。

但是,即使我关闭表单,分配的内存也只会下降大约 3000K,第一个表单关闭,然后每个表单关闭 100K。如果我再添加一些表格,内存会增加,如果我关闭一些相同的 -3000K,-100K 内存减少模式再次发生。

有没有人遇到过这个?任何人都可以帮忙,因为这看起来有点像一场表演赛!我期待着您的回复。

顺便说一句,原始的 VB6 版本没有这个问题,并且如果您关闭每个表单,它的内存分配也会返回到它开始的位置,而不是因为应用程序释放的数量少于分配的数量,分配会逐渐增加。

编辑:我刚刚在开发中遇到了同样的错误。似乎在 UserControl 中引发了 WIN32Exception。错误是“创建窗口句柄时出错”。

谢谢和亲切的问候,杜安。

4

2 回答 2

0

您的应用只是在消耗 Windows 强加的句柄配额。默认情况下它是 10,000 个句柄,尝试创建另一个窗口将失败,并显示“创建窗口句柄时出错”。

不确定对于 VM 或 TS 安装,这些限制可能较低。上限相当大,远离它应该永远不会有任何麻烦。在任务管理器中,使用 View + Select Columns 并勾选 USER objects、GDI object 和 Handles。这些列中的任何一个无限制地增长都是代码中存在错误的明确迹象,例如未处理表单或控件。消耗更多内存是这种泄漏的副作用。

于 2010-07-08T14:11:05.637 回答
0

事实证明,在释放 USER 对象之前,我们需要在自定义 UserControls 中显式地处理每个单独的控件。

于 2010-07-12T16:36:49.607 回答