【发布时间】: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