C# 缓冲时WCF内存不足服务器异常
我在服务器上收到此错误 System.InsufficientMemoryException,mscorlib,版本=4.0.0.0, 文化=中性,PublicKeyToken=b77a5c561934e089 未能分配536870912字节的托管内存缓冲区。这个 可用内存量可能较低 这发生在最后一条语句返回myCollection之后。当我收集了大约45k个项目时 服务器配置:C# 缓冲时WCF内存不足服务器异常,c#,performance,wcf,memory,C#,Performance,Wcf,Memory,我在服务器上收到此错误 System.InsufficientMemoryException,mscorlib,版本=4.0.0.0, 文化=中性,PublicKeyToken=b77a5c561934e089 未能分配536870912字节的托管内存缓冲区。这个 可用内存量可能较低 这发生在最后一条语句返回myCollection之后。当我收集了大约45k个项目时 服务器配置: <binding name="LargeTCPBinding" closeTimeout="
<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),将我的集合放入内存后的差异约为170MB
异常发生在返回集合之后(因此它似乎发生在缓冲发送期间)
如果我将wcf连接配置切换到流式,这将修复异常,但通话时间从25秒变为1:05分钟
我只是想了解这里发生了什么,因为这个收藏并没有那么大。这是在WCF 4.0 64位cpu上运行的 这里重要的不是集合的大小,而是对象图的复杂性。如果集合包含具有许多字段和/或属性的引用类型,则这是一个更复杂/更深的图形 在WCF向您发送响应之前,它必须将对象图序列化为二进制,通过线路发送,然后客户端将其反序列化 缓冲意味着将集合序列化为内存中的结构,然后作为一个大数据块发送。流化表示集合在序列化时发送 您的对象可能不大,但它的序列化表示可能相当庞大,这仅仅是因为为您的数据创建了SOAP信封和XML表示等等 这就是为什么Streamed解决了您的问题:buffered不能一次在内存中以序列化形式表示整个对象图