如何强制对象的垃圾收集你不能解除引用?

时间:2011-10-25 14:57:21

标签: c# garbage-collection exchangewebservices ews-managed-api

我们正在使用EWS托管API,它会在给定间隔后轮询MS Exchange以获取新邮件。每次调用轮询调用(PullSubscription.GetEvents())时,Microsofts API都无法正确处理NetworkStream并导致内存按比例增加。这是以前的discussed here,但从未解决过。使用ANTS Profiler,我们能够确定哪些对象在内存中不断增长并隔离问题。

既然问题已被隔离 - 有没有办法处理在我们没有引用的外部API中创建的NetworkStream? GC.Collect()似乎没有处置它,因为它仍然有一个活动的引用。我们可以做些什么来清理悬空参考?我们可以使用一些包装来强制清除他们的错误SDK吗?

2 个答案:

答案 0 :(得分:6)

无法强制GC释放引用对象的内存!

首先,我建议联系microsoft本身以获取有关此错误的帮助。

其次,你在谈论“处置”还是只是释放内存?它们是两个完全不同的东西。 (IDisposable模式,终结者)。

第三,你可以解引用引用这些对象的对象吗?

第四,一种可能的解决方案是使用反射器反编译为您提供问题的代码,了解一种方法可以到达保留引用对象的字段,在代码中使用反射来访问私有字段和把它们归零。 是一个非常肮脏的黑客,但如果你没有别的办法是我唯一能想到的。只有在你不能以任何其他方式进行时才这样做。

答案 1 :(得分:0)

最简单的方法是运行将SDK连接到自己的AppDomain的部分,并在完成后卸载AppDomain。这将导致释放AppDomain中分配的所有内存。

但是您需要为项目添加一些工作,因为您只能与AppDomain MarshalByRef对象互换或标记为serilizable

这还允许您监视AppDomain消耗的内存量。因此,您可以创建AppDomain,在其中运行错误的SDK,如果达到特殊的内存消耗限制,您可以卸载它。