【问题标题】:asp.net interop memory limitationasp.net 互操作内存限制
【发布时间】:2010-12-21 02:40:35
【问题描述】:

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

已解决!原来该对象正在创建一个窗口句柄,而我们达到了 10K 窗口句柄的限制(除了在 IIS 中出于某种原因在 2K 实例上发生)

【问题讨论】:

  • 您是否正确处理了这些 COM 对象?
  • 是的,我明确地发布了它们。问题不在于它正在泄漏内存,内存利用率是正常的——只是有很多并发用户。服务器仍然有大量的 RAM,但不知何故它卡住了。 (刚刚进行了另一次测试,仅使用 100Mb 就出现了问题……很奇怪)
  • 这些 COM 对象是在进程内还是进程外?他们的公寓型号是什么?它们是否标记为 Aparment、Free、Both、Single?操作系统是 32 位还是 64 位?这些组件是否与 Shell 或某些 UI 相关联?
  • @Simon 你真的在上面,原来 COM 对象正在创建一个窗口对象。

标签: asp.net com-interop


【解决方案1】:

解决了!原来该对象正在创建一个窗口句柄,而我们达到了 10K 窗口句柄的限制(除了在 IIS 内部由于某种原因它发生在 2K 实例上)

【讨论】:

  • 你真的在 5½ 年后回去不接受我的回答吗? XD 不用担心,人们最好将实际答案放在顶部,这很有趣:)
【解决方案2】:

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

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

我假设您的 标记中包含 AspCompat=true...如果您不这样做,则根本不会期望它运行。

您能否给我们一些关于您的 COM 对象的详细信息?它有什么作用,您可以在调用它的地方发布一些代码,包括 COM 对象签名吗?您希望单个对象占用多少内存?

我的第一个怀疑是,仅基于我目前阅读的信息,500Mb 并不是真正使用的总内存,和/或您遇到了内存碎片问题。我已经看到 IIS 进程在使用不到一半的内存时会发生这种情况,并且错误往往是随机的,具体取决于当时正在创建的对象。顺便说一句,80070008 是“存储空间不足”。

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

制定攻击计划需要有关 COM 对象及其使用方式的更多信息。

【讨论】:

  • 被认为是最有帮助的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您可能会考虑对象池,而不是每次都创建一个新对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多