我们正在使用EWS托管API,它会在给定间隔后轮询MS Exchange以获取新邮件。每次调用轮询调用(PullSubscription.GetEvents()
)时,Microsofts API都无法正确处理NetworkStream
并导致内存按比例增加。这是以前的discussed here,但从未解决过。使用ANTS Profiler,我们能够确定哪些对象在内存中不断增长并隔离问题。
既然问题已被隔离 - 有没有办法处理在我们没有引用的外部API中创建的NetworkStream? GC.Collect()似乎没有处置它,因为它仍然有一个活动的引用。我们可以做些什么来清理悬空参考?我们可以使用一些包装来强制清除他们的错误SDK吗?
答案 0 :(得分:6)
无法强制GC释放引用对象的内存!
首先,我建议联系microsoft本身以获取有关此错误的帮助。
其次,你在谈论“处置”还是只是释放内存?它们是两个完全不同的东西。 (IDisposable模式,终结者)。
第三,你可以解引用引用这些对象的对象吗?
第四,一种可能的解决方案是使用反射器反编译为您提供问题的代码,了解一种方法可以到达保留引用对象的字段,在代码中使用反射来访问私有字段和把它们归零。 是一个非常肮脏的黑客,但如果你没有别的办法是我唯一能想到的。只有在你不能以任何其他方式进行时才这样做。
答案 1 :(得分:0)
最简单的方法是运行将SDK连接到自己的AppDomain
的部分,并在完成后卸载AppDomain。这将导致释放AppDomain中分配的所有内存。
但是您需要为项目添加一些工作,因为您只能与AppDomain
MarshalByRef
对象互换或标记为serilizable
。
这还允许您监视AppDomain消耗的内存量。因此,您可以创建AppDomain,在其中运行错误的SDK,如果达到特殊的内存消耗限制,您可以卸载它。