2013-06-12 60 views
0

我在我的服務器上收到此錯誤。WCF從緩衝區服務器InsufficientMemoryException緩衝

System.InsufficientMemoryException,mscorlib程序,版本= 4.0.0.0, 文化=中性公鑰= b77a5c561934e089

無法分配的536870912個字節的管理存儲器緩衝器。 可用內存量可能很低。

這發生在最後一條語句返回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(假)並讓我收集到內存是約170 MB後的差額。

返回集合後發生異常(所以它在緩衝發送期間發生)。

如果我將我的wcf連接配置切換爲流式,這可以修復異常,但通話時間從25秒到1:05分鐘。

只是試圖瞭解這裏發生的事情,因爲這個集合並不那麼大。這是在WCF 4.0,64位CPU上運行的。

回答

1

這裏重要的不是集合的大小,而是對象圖的複雜性。如果您的集合包含具有許多字段和/或屬性的引用類型,則這是更復雜/更深的圖。

在WCF可以向您發送響應之前,它必須將對象圖形序列化爲二進制文件,通過線路發送,然後客戶機將其反序列化。

緩衝表示集合被序列化爲內存中的結構,然後作爲一個大塊發送。 Streamed意味着集合在序列化時發送。

你的對象可能並不大,但它的序列化表示形式可能是相當巨大的,只是由於你的數據和XML表示創建SOAP信封等

這就是爲什麼流解決您的問題:緩衝不能一次性在內存中以序列化的形式表示整個對象圖形。