0

我在我的服务器上收到此错误。

System.InsufficientMemoryException,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089

未能分配 536870912 字节的托管内存缓冲区。可用内存量可能很低。

这发生在最后一条语句return myCollection之后。当 myCollection 大约有 45k 个项目时。

服务器配置:

<binding name="LargeTCPBinding"
         closeTimeout="00:30:00"
         openTimeout="00:30:00"
         receiveTimeout="01:00:00"
         sendTimeout="01:00:00"
         hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647"
         maxReceivedMessageSize="2147483647"
         maxBufferSize="2147483647">
  <readerQuotas maxDepth="2147483647"
                maxStringContentLength="2147483647"
                maxArrayLength="2147483647"
                maxBytesPerRead="2147483647"
                maxNameTableCharCount="2147483647" />
  <security mode="Transport">
    <transport clientCredentialType="Windows" />
  </security>
</binding>

我做了一些基本的内存分析GC.GetTotalMemory(false)并将我的集合放入内存后的差异约为 170 MB。

返回集合后发生异常(因此它似乎在缓冲发送期间发生)。

如果我将我的 wcf 连接配置切换到Streamed,这将修复异常,但通话时间从 25 秒变为 1:05 分钟。

只是想了解这里发生了什么,因为该集合并没有那么大。这是在 WCF 4.0、64 位 cpu 上运行的。

4

1 回答 1

1

这里重要的不是集合的大小,而是对象图的复杂性。如果您的集合包含具有许多字段和/或属性的引用类型,则这是一个更复杂/更深入的图。

在 WCF 可以向您发送响应之前,它必须将对象图序列化为二进制,通过网络发送,然后客户端对其进行反序列化。

缓冲意味着集合被序列化为内存中的结构,然后作为一个大块发送。流式处理意味着集合在序列化时发送。

您的对象可能不大,但它的序列化表示可能非常庞大,这仅仅是因为为您的数据创建的 SOAP 信封和 XML 表示等。

这就是 Streamed 解决您的问题的原因:缓冲不能一次在内存中以序列化形式表示整个对象图。

于 2013-06-12T22:03:09.413 回答