asp.net互操作内存限制

时间:2010-10-23 04:58:03

标签: asp.net com-interop

我有一个使用传统COM互操作库的asp.net应用程序。工作正常,直到内存达到大约500Mb,然后它不再能够创建新的COM对象(获得各种异常,例如从IClassFactory创建具有CLSID {FFFF-FFFF-FFFF-FFF-FFFFFF}的COM组件的实例失败由于以下错误:80070008.)。它几乎看起来像是在达到某种内存限制,但它是什么?可以改变吗?

解决了!结果是对象正在创建一个Window句柄,我们正在达到10K Window句柄限制(除非在IIS内部由于某种原因发生在2K实例上)

4 个答案:

答案 0 :(得分:2)

解决!事实证明对象正在创建一个Window句柄,我们正在达到10K窗口句柄限制(除非在IIS内部由于某种原因发生在2K实例上)

答案 1 :(得分:1)

什么操作系统,是32位还是64位?你用什么来确定内存使用量?

当你说明确释放对象时,你的意思是你在使用Marshal.ReleaseComObject()?

我假设你的<%@ Page>中有AspCompat = true标签......如果不这样做,就不会指望它会运行。

你能告诉我们你COM对象的一些细节吗?它做了什么,你可以在你调用它的地方发布一些代码,包括COM对象签名吗?您希望单个对象占用多少内存?

我的第一个嫌疑人,仅根据我到目前为止所读到的信息,是500Mb并非真正使用的总内存,和/或您有内存碎片问题。我已经看到这种情况发生在IIS进程中,当使用的内存不到一半时,错误往往是随机的,具体取决于当时正在创建的对象。 BTW,80070008“存储空间不足”。

当然,32位机器上的进程限制为2GB,但即使进程没有使用完整的2GB,如果在创建对象时没有所需大小的连续内存块,你也会尝试分配时出现内存不足错误。许多并发用户意味着很多COM对象(和其他对象)在短时间内被分配和释放......这表明碎片是一个嫌疑人。

提出攻击计划需要有关COM对象以及如何使用它的更多信息。

答案 2 :(得分:0)

使用命令模式在异步线程中排队和执行com interop。这可以释放iis使用的线程数,并允许您控制com应用程序的调用/实例数。

答案 3 :(得分:0)

您可以考虑对象池而不是每次创建新对象。