代码之家  ›  专栏  ›  技术社区  ›  Dib

VB.Net 3.5 MDI应用程序-MDI子窗体在使用N个内存后停止打开

  •  0
  • Dib  · 技术社区  · 15 年前

    我希望有人能帮忙!

    我们有一个相当大的VB.NETMDI应用程序,它是从VB6转换而来的。当它第一次在没有打开子窗体的情况下运行时,它使用了大约35000K。随着越来越多的表单被打开(而不是关闭),内存使用量(根据任务管理器)逐渐增加到每个表单大约4000K(我知道T.M.只显示应用程序分配的内存,而不是实际使用的内存。)

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

    例如: -在整个机器只有512M的虚拟机上,它看起来大约是7-8个窗体,发生这种情况时,分配的内存大约是80000K。 -在我们的终端服务器机器上,它有3GB的空间,同时也运行着各种其他急需的应用程序,它在大约20+个窗体上停止,内存分配大约为100000-105000K。

    我试过使用perfmon来查看是否有泄漏,这表明使用稳定。

    然而,即使我关闭窗体,分配的内存对于第一个关闭的窗体只会减少大约3000K,之后每个关闭的窗体都会减少100K。如果我再加上一些形式,记忆会增加,如果我关闭一些形式,同样的-3000K,-100kmeomry减少模式会再次发生。

    以前有人来过吗?有谁能帮帮忙,因为这看起来有点像一个表演的塞子!期待您的回复。

    编辑: 我刚刚在dev中得到了相同的错误。似乎在UserControl中抛出了WIN32Exception。错误是“创建窗口句柄时出错。”

    谢谢并致以亲切的问候,

    2 回复  |  直到 15 年前
        1
  •  0
  •   Hans Passant    15 年前

    你的应用程序只是消耗了Windows强加的句柄配额。默认情况下,它是10000个句柄,尝试创建另一个窗口将失败,并显示“Error creating window handle”。

    也许对于VM或TS安装来说,这些限制比较低,不确定。上限是相当大的,你不应该有任何困难远离它。在任务管理器中,使用View+Select列并勾选USER objects、GDI object和Handles。这些列中的任何一个在没有绑定的情况下增长都是代码中存在bug的一个明显迹象,比如不处理窗体或控件。消耗更多内存是这次泄漏的副作用。

        2
  •  0
  •   Dib    15 年前

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