服务器上 WCF(双工)中的内存泄漏

Posted

技术标签:

【中文标题】服务器上 WCF(双工)中的内存泄漏【英文标题】:Memory leak in WCF (Duplex) on Server 【发布时间】:2012-03-11 12:33:17 【问题描述】:

您好,在双工模式下运行 WCF 的服务存在很大问题。 它会泄漏内存(不多,但每天大约 80MB),在让内存分析器与服务一起运行 24 小时后,我发现大部分内存位于 byte[] 中,引用相当混乱,但我大多数引用都以某些东西结尾像这样: “根”看起来像这样:

我也看到很多 ServiceChannel(大约 200 个)从回调渠道传来(我认为)。

我很确定我只为每个连接的客户端持有其中的 1 个。

总的来说,我的问题似乎与此几乎相同:memory leak in silverlight Wcf implementation 但在服务器端。

我什至尝试过这里提到的[MTAThread] 东西:WCF service leaks handles and memory when a client times out,但它并没有解决问题。

我只是不认为问题出在我的代码上,因为我在使用OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>() 将回调通道包装在我自己的一个对象中并且那些不会泄漏(只有其中一个用于在任何给定快照的内存中的每个客户端)-确保我多次重置这些回调,因为通道可能会更改(客户端丢失连接或重新连接)但我没有办法处理旧引用,所以我只删除它们和GC 应该在他们身上完成它的工作。

我确实在我的服务中使用了PerCall,所以我的代码中根本没有这些对象的句柄。

除了每隔几天重新启动服务之外,我真的不知道如何处理这个问题 - 我现在不想提出一个解决方案:(

所以请给我一些帮助/提示 - 非常感谢!

【问题讨论】:

如果客户端故障很多并且您必须重新创建回调通道,您是否会看到更高的内存增益?如果客户离开了,你会Abort回调通道吗? 这对我来说很难说,但这可能是这种情况 - 不,我不会中止服务器上的频道(我该怎么做 - 使用 GetCallbackChannel<T> 我只得到 T - 你必须把它转换成某种代理吗?) 您应该可以将其转换为IClientChannel 谢谢 - 在另一篇文章中找到此内容,现在正在实施。当我让你正确时,如果引发了故障事件,我应该在 Clientchannel 上调用 .Abort 对吗? - 我认为我什至可以通过处理 .Close 来改进我的代码,这样我就不会再因为发布到断开连接的客户端而遇到麻烦了。 现在正在测试这个 - 我想我必须等待几个小时看看这是否可以 - 顺便说一句:我应该在关闭/故障 IClientChanels 上调用 dispose 吗? 【参考方案1】:

当基于会话的通道发生故障时,对Close 的调用将引发异常。但是,在这种情况下,有一些代理端资源没有被清理,这些资源只有在你 Abort 故障通道时才会被清理

确保在更换故障通道时,您首先 Abort 旧通道

【讨论】:

以上是关于服务器上 WCF(双工)中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

libxml2.2 中的内存泄漏

转储内存以查找 C++ 应用程序中的内存泄漏

存储过程会导致内存泄漏吗?

c++ 内存泄漏问题

避免、发现和消除 Cocoa 中的内存泄漏

Node.js中的内存泄漏分析