【问题标题】:C# WCF - Client/Server - System.OutOfMemory ExceptionC# WCF - 客户端/服务器 - System.OutOfMemory 异常
【发布时间】:2013-04-10 00:16:38
【问题描述】:

问题。

  • 使用网络 TCP 绑定(发布者/订阅者模式)的 C# WCF 客户端/服务器应用程序。
  • 客户端不断崩溃并显示OutOfMemoryException
  • 当我与客户端一起运行任务管理器时,我可以看到内存使用列增加,直到应用程序崩溃。
  • 目的是让客户端的多个实例在不同的机器上运行。

场景

  • 我有一个客户端/服务器应用程序。
  • 发布者/订阅者设计模式。
  • 在服务器端,有 6 个字典组成一个缓存,每个字典都包含一个自定义对象作为值。
  • 作为 while 循环的一部分,每组字典值每 5 秒更新一次。
  • 在 5 秒循环结束时,将 6 个字典添加到数据合同对象中,每个字典都作为不同的数据成员。
  • 然后将数据合同对象通过线路发送到客户端,其中还有 6 个字典。
  • 然后,我遍历每个数据协定字典,根据值是否已经存在,添加或更新其客户端等效项的内容。

总结

  • 6 个字典服务器端。
  • 数据合约中的 6 个可序列化字典。
  • 6 个可绑定字典客户端。
  • WCF 使用 Net TCP 绑定通过网络传输数据。

规格

  • C# .Net 3.5
  • 客户端使用一个 DevExpress 表单和 9 个 DX 网格视图和选项卡控件。
  • 大多数自定义对象都包含一个“子资产”字典。 - 我为这个属性使用了一个可绑定的字典,我想当你有几百个对象时它会产生开销(尽管我不认为使用可序列化的字典会产生很大的不同,因为它们都包含相同的序列化代码) .
  • 两侧的绑定在开始时以编程方式创建一次并包含相同的设置(见下文)。

    NetTcpBinding netTcpBinding = new NetTcpBinding(SecurityMode.None);
    
    EndpointAddress endpointAddress = new EndpointAddress(EndpoindAddress);
    InstanceContext context = new InstanceContext(callbackinstance);
    
    netTcpBinding.MaxConnections = 5;
    netTcpBinding.MaxBufferSize = 2147483647;
    netTcpBinding.MaxBufferPoolSize = 2147483647;
    netTcpBinding.MaxReceivedMessageSize = 2147483647;
    netTcpBinding.ReceiveTimeout = TimeSpan.MaxValue;
    netTcpBinding.CloseTimeout = TimeSpan.MaxValue;
    netTcpBinding.TransferMode = TransferMode.Buffered;
    netTcpBinding.ListenBacklog = 5;
    
    DuplexChannelFactory<ISubscription> channelFactory =
       new DuplexChannelFactory<ISubscription>(
              new InstanceContext(this), 
              netTcpBinding,
              endpointAddress);
    
    proxy = channelFactory.CreateChannel();
    

我的问题

  • 如何防止客户端内存使用量不断增长?
  • 如果我只发送对象的通用列表而不是可序列化的字典,客户端的内存使用会显着降低吗?
  • 我是否为这种实现正确设置了绑定配置?
  • 对于解决此内存问题的任何其他建议,我们将不胜感激。

【问题讨论】:

  • 鉴于您提出的问题数量以及接受率和点赞率较低,您能解释一下帮助您的动机吗?
  • 我们在工作中使用 IE6,我不能接受,因为接受按钮上的 JScript 不起作用,而且我担心它是一家公司,一切都被严重锁定。我不倾向于在家中经常使用互联网,所以我没有机会接受太多答案。另外,您忘记了一个事实,有时可能有 20 个答案,但它们可能都是垃圾和不相关/不正确的。
  • 好吧,SO 并不适合所有人。我推荐expertsexchange。
  • 我很难理解为什么你有这样的问题?
  • 因为它非常令人沮丧,尤其是这样一个非常沉重的问题,它会吓跑人们。当你花时间接受你的问题的答案时,你会让很多人开心。人们会花时间回答您的问题,如果您因为无法下班而需要在家回答问题,那么实际花费这些时间似乎是一种票价交易。

标签: c# wcf out-of-memory


【解决方案1】:

•如何防止 刚刚成长的客户端界面 在内存方面呈指数增长 用法?

呃,它没有呈指数级增长,但请确保您没有杂散的引用, 特别是寻找可能引用您的流浪对象的事件和 lambda

•内存使用情况是否会在 如果我发送,客户端会低得多 仅作为对象的通用列表 反对可序列化的字典?

我对此表示怀疑。

•我是否设置了绑定 正确配置此类 实施?

他们没有发现任何明显的问题

•解决此问题的任何其他建议 内存问题会很大 赞赏。

查查Windbg,它需要时间来正确学习,但它可以帮助你看到什么有什么引用...它可能不是你所期望的

【讨论】:

    【解决方案2】:

    您是否确保只有一个 ServiceChannelFactory 并且 WCF 通道尽可能晚地打开并尽可能早地关闭?

    【讨论】:

      【解决方案3】:

      将 MaxBufferPoolSize 最大化到 2 GB (netTcpBinding.MaxBufferPoolSize = 2147483647;) 不是一个明智的决定,除非您有空闲的 RAM。

      WCF 将继续积累缓冲区,您可能会收到OutOfMemoryException

      有一个很好的解释here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 2012-10-03
        • 1970-01-01
        相关资源
        最近更新 更多