服务器上 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(双工)中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章