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

6

你好,我有一个关于运行WCF的服务在双工模式下出现了一些问题。

它会泄漏内存(虽然不多,但每天大约80MB),在将内存剖析器与服务同时运行24小时后,我发现大部分内存都停留在由混乱引用的byte[]中,但是,我发现大多数引用最终像这样结束:

one path holding the byte[] - array

"根"看起来像这样:

root

我还看到了许多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,所以在我的代码中根本没有这些对象的句柄。

除了每隔几天重启服务之外,我真的不知道如何处理这个问题 - 这不是我想要的解决方案 :(

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


我很难确定,但这可能是情况 - 不,我不会在服务器上中止通道(我该怎么做 - 使用GetCallbackChannel <T>,我只得到了T - 您必须将其转换为某种代理吗?) - Random Dev
1
你应该能够将它转换为 IClientChannel - Richard Blewett
谢谢 - 我在另一篇帖子上找到了这个,现在正在实施。如果引发故障事件,我应该在Clientchannel上调用.Abort,对吗?- 我认为我甚至可以通过处理.Close来改进我的代码,这样我就不必再遇到向已断开连接的客户端发布消息时出现问题的情况了。 - Random Dev
我正在进行测试 - 我认为我需要等待几个小时才能确定这是否正常 - 顺便问一下:在关闭/故障的 IClientChanels 上是否应该调用 dispose? - Random Dev
我能够确定的是,确实存在很多故障回调通道 - 我猜这是因为客户端经常移动和改变接入点。 - Random Dev
显示剩余8条评论
1个回答

7
当基于会话的通道出现故障时,调用 Close 会抛出异常。但是,在这种情况下没有清理代理端资源,只有在你调用 Abort 清理故障通道时才会清理它们。
确保当你替换故障的通道时,首先要调用 Abort 关闭旧通道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接