如何在 C# 和 COM 对象中管理内存
How to manage memory in c# and COM objects
我对垃圾收集器在 C# 应用程序中的工作方式几乎没有疑问
应用程序在 10 天内执行繁重的 I/O 操作和数据库操作。
我在一些地方读到一些专家建议不要使用 GC,因为它是 Framework 的责任并让它完成它的工作,否则如果你强制它,应用程序的性能会降低。
我不知何故需要使用 32 位 API,其中内存限制为 2GB 并留下其他资源,如果它开始显示为 1.5GB,我们在本次讨论中的应用程序可能会崩溃。
对于托管资源,我能够轻松取回循环中每次迭代后使用的内存。但是当涉及到我用于地理处理的 COM 组件时,内存释放的方式非常不一致。在给定的迭代中使用了各种 COM 对象后,我小心翼翼地释放它们,但我最终还是遇到了诸如 'not enough memory' 之类的错误。所以在大约 300 到 400 次迭代后[每次迭代需要花费接近几分钟的时间],我只需要关闭并重新打开以释放所有资源。
如果有人想听更多,我会提供更多的意见。
我要解决的主要问题是,如何在每次迭代后始终如一地恢复所有内存让我们在 for 循环中通过清理所有内容,尤其是 COM 对象。
此致
谢谢柯克的帮助。我将把它作为这个问题的永久解决方案。但是我能够为 类 的其余部分收集内存,因为它超出了 C#。我们需要仔细找出所有游标的打开位置,并在使用完毕后立即释放内存。我遇到的问题是由于一些遗留代码和许多全局变量是为不释放内存的 arcobjects 类 声明的。
我仍然注意到 IFeatureClass 没有释放内存。但是,现在我能够动态清除内存,让进程尽可能长时间地继续。
我对垃圾收集器在 C# 应用程序中的工作方式几乎没有疑问
应用程序在 10 天内执行繁重的 I/O 操作和数据库操作。
我在一些地方读到一些专家建议不要使用 GC,因为它是 Framework 的责任并让它完成它的工作,否则如果你强制它,应用程序的性能会降低。
我不知何故需要使用 32 位 API,其中内存限制为 2GB 并留下其他资源,如果它开始显示为 1.5GB,我们在本次讨论中的应用程序可能会崩溃。
对于托管资源,我能够轻松取回循环中每次迭代后使用的内存。但是当涉及到我用于地理处理的 COM 组件时,内存释放的方式非常不一致。在给定的迭代中使用了各种 COM 对象后,我小心翼翼地释放它们,但我最终还是遇到了诸如 'not enough memory' 之类的错误。所以在大约 300 到 400 次迭代后[每次迭代需要花费接近几分钟的时间],我只需要关闭并重新打开以释放所有资源。
如果有人想听更多,我会提供更多的意见。
我要解决的主要问题是,如何在每次迭代后始终如一地恢复所有内存让我们在 for 循环中通过清理所有内容,尤其是 COM 对象。
此致
谢谢柯克的帮助。我将把它作为这个问题的永久解决方案。但是我能够为 类 的其余部分收集内存,因为它超出了 C#。我们需要仔细找出所有游标的打开位置,并在使用完毕后立即释放内存。我遇到的问题是由于一些遗留代码和许多全局变量是为不释放内存的 arcobjects 类 声明的。 我仍然注意到 IFeatureClass 没有释放内存。但是,现在我能够动态清除内存,让进程尽可能长时间地继续。