9

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

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

4

2 回答 2

6

没有办法强制 GC 为引用的对象释放内存!

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

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

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

第四,一种可能的解决方案是使用反射器反编译给您带来问题的代码,了解一种可以到达保留引用对象的字段的方法,在代码中使用反射来访问私有字段并将它们放入无效的。是一个非常肮脏的黑客,但如果你没有其他办法是我唯一能想到的。仅当您无法以任何其他方式进行时才这样做。

于 2011-10-25T15:06:32.400 回答
0

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

但是您需要为您的项目添加一些工作,因为您只能与AppDomainaMarshalByRef对象交换或标记为serilizable.

这也将允许您监控 AppDomain 消耗的内存量。因此,您可以创建您的 AppDomain,在其中运行有缺陷的 SDK,如果它达到内存消耗的特殊限制,您可以卸载它。

于 2011-10-25T15:08:14.180 回答