我正在开展一个大型项目,其中提供了一个自定义(非常好的和强大的)框架,我们必须使用它来显示表单和视图。
有一个抽象类 StrategyEditor(从框架中的某个类派生),每当打开新的 StrategyForm 时都会实例化它。
StrategyForm
(定制的窗框)包含StrategyEditor
.
StrategyEditor
包含StrategyTab
.
StrategyTab
包含StrategyCanvas
.
这是大类的一小部分,以阐明如果在运行时在内存中分配一个 StrategyForm 对象,将创建许多对象。我的组件拥有上述所有这些类,但StrategyForm
其代码不受我控制。
现在,在运行时,用户打开了许多策略对象(这会触发新 StrategyForm 对象的创建)。44 个策略对象,我们看到应用程序创建的 USER OBJECT HANDLES(我将从这里开始使用 UOH)达到大约 20k+,而在注册表中,句柄的默认数量是 10k。在此处阅读有关用户对象的更多信息。在不同机器上的测试清楚地表明,打开的策略对象数量对于弹出消息是不同的——在一个 m/c 上如果是 44,那么在另一个 m/c 上可以是 40。
当我们看到消息弹出时,这意味着应用程序将缓慢响应。对象越少越糟糕,然后创建窗口框架和后续对象失败。
我们首先认为这是内存不足的问题。但是随后阅读更多关于new
C#的内容有助于理解如果应用程序内存不足将引发异常。我觉得这不是内存问题(任务管理器还显示了 1.5GB+ 可用内存。)
M/C 规格
Core 2 Duo 2GHz+
4GB RAM
80GB+ 用于页面文件的可用磁盘空间
虚拟内存集:4000 - 6000
我的问题
Q1。这看起来像一个内存问题,我错了,不是吗?
Q2。这是否表明免费 UOH 已用尽(正如我所想的那样)以及导致创建窗口句柄失败的原因?
Q3。我们如何避免加载StrategyEditor
对象(超过阈值,密切关注 UOH 的当前使用情况)?(我们已经知道如何获取正在使用的 UOH 的数量,所以不要去那里。)请记住,对的调用new StrategyForm()
不在我的组件的控制范围内。
Q4。我有点困惑 -用户对象的句柄到底是什么?MSDN 是在讨论我们创建的任何对象,还是仅讨论某些特定对象,如窗口句柄、光标句柄、图标句柄?
Q5。究竟是什么原因导致 UOH 用完?(几乎与 Q4 相同)
我会非常感谢任何能给我一些知识渊博的答案的人。非常感谢!:)
[更新]
根据 Stakx 的回答,请注意正在打开的窗口将仅由用户关闭。这是一种 MDI 应用程序情况,其中打开了太多子窗口。所以,Dispose
不能随时调用。