如何在c#和COM对象中管理内存

时间:2018-11-05 09:49:54

标签: c# .net memory-leaks arcobjects

我有几个问题,垃圾收集器如何在C#应用程序中工作

应用程序在10天的时间内执行大量的I / O操作和数据库操作。

我读过一些专家建议不要使用GC的地方,因为这是Framework的责任,让它完成工作,或者如果您强制执行,则应用程序的性能将会降低。

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

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

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

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

最好的问候

1 个答案:

答案 0 :(得分:0)

谢谢Kirk的帮助。我将其作为该问题的永久解决方案。但是我能够为其余的类收集内存,因为它超出了C#。我们需要谨慎地找出所有游标的打开位置,并在使用完后立即释放内存。我遇到的问题是由于一些遗留代码,并且为不释放内存的arcobjects类声明了许多全局变量。 仍然我注意到IFeatureClass没有释放内存。但是,到目前为止,我能够动态清除内存,从而使该过程尽可能长地继续。