【问题标题】:How to manage memory in c# and COM objects如何在 c# 和 COM 对象中管理内存
【发布时间】:2018-11-05 09:49:54
【问题描述】:

我对垃圾收集器在 C# 应用程序中的工作方式有几个疑问

应用程序在 10 天内执行繁重的 I/O 操作和数据库操作。

我在一些专家建议不要使用 GC 的地方读到,因为它是框架的责任,让它完成它的工作,或者如果你强制它,应用程序的性能会变慢。

我不知何故需要使用 32 位 API,其中内存限制为 2GB 并保留其他资源,如果它开始显示为 1.5GB,我们在此讨论中的应用程序可能会崩溃。

对于托管资源,我可以轻松取回循环中每次迭代后使用的内存。但是当涉及到我用于地理处理的 COM 组件时,内存的释放方式非常不一致。在给定的迭代中使用它们后,我会很好地释放各种 COM 对象,但最终还是会遇到诸如“内存不足”之类的错误。所以在大约 300 到 400 次迭代之后[每次迭代需要一些时间接近几分钟],我只需要关闭并重新打开即可释放所有资源。

如果有人想听更多,我会提供更多输入。

我希望解决的主要问题是,如何在每次迭代后始终如一地恢复所有内存,让我们在 for 循环中说,通过清理所有内容,尤其是使用 COM 对象。

最好的问候

【问题讨论】:

  • 你能显示一些代码吗?您应该实现IDisposable 接口,然后在其中释放您的COM 对象。在 COM 中,处理时要使用的主要对象是 'GC' 和 Marshal,具体参考 Marshal.FinalReleaseComObject 方法
  • 这个问题真的很宽泛。您可能想发布一个泄漏资源的循环的确切示例。让问题更具体一点。
  • 如果您正在执行地理处理,如果您在后台执行,您可以使用 64 位。 desktop.arcgis.com/en/arcmap/10.3/analyze/executing-tools/…
  • 您好,感谢您的建议。后台地理处理工具是否也可以通过引擎许可使用?
  • 这里是代码 geoprocessor.ClearMessages(); // 将覆盖输出选项设置为 true geoprocessor.OverwriteOutput = true;尝试 { Logger.Write("RunTool 已启动", "AppLog"); // 执行工具 geoprocessor.Execute(process, null); ReturnMessages(地理处理器); ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(地理处理器); ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(进程);地理处理器=空;进程=空; } catch (Exception ex) { Logger.Write("RunTool 中的异常::"+ex.Message, "ExceptionHandling"); ReturnMessages(地理处理器); }

标签: c# .net memory-leaks arcobjects


【解决方案1】:

感谢柯克的帮助。我会把它作为这个问题的永久解决方案。但是我能够为其他类收集内存,它超出了 C#。我们需要谨慎地找出所有游标的打开位置,并在使用完成后立即释放内存。我遇到的问题是由于一些遗留代码和许多全局变量为没有释放内存的 arcobjects 类声明的。 我仍然注意到 IFeatureClass 没有释放内存。但是,现在我能够动态清除内存,让进程尽可能长时间地继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多