2015-09-28 94 views
1

我們的服務器正在生產環境中運行,但運行幾天後,在WCF調用時會發生內存不足異常。內存不足在WCF調用時出現異常

Line 36007: GlobalUnhandledException: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
Line 36063: at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags) 
Line 36063: at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags) 
Line 36064: at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
Line 36065: at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 

我們嘗試給出配置中的最大數組大小。在服務器端綁定WCF的配置。

<netTcpBinding> 
    <binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="524288" sendTimeout="00:00:35" transactionFlow="true" > 
     <reliableSession enabled="true" /> 
     <security mode="None" /> 
    </binding> 
    </netTcpBinding> 

在WCF連接調用中是否發生內存泄漏問題?

服務行爲:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, 
       ConcurrencyMode = ConcurrencyMode.Multiple, 
       ReleaseServiceInstanceOnTransactionComplete = false)] 

有什麼我配置過程中錯過了,有什麼措施來糾正或識別該內存溢出異常在這個問題上的任何幫助表示讚賞。

UPDATE: 經營合同:

[OperationContract] 
    [TransactionFlow(TransactionFlowOption.Allowed)] 

回答

2

是的,你的配置問題。

這就是你的配置是指:

InstanceContextMode = InstanceContextMode.PerCall - 爲對服務的每次調用啓動一個新的服務實例。

ConcurrencyMode = ConcurrencyMode.Multiple - 允許多線程服務實例

ReleaseServiceInstanceOnTransactionComplete = false內啓動 - 一旦調用完成前不要釋放服務實例。

編輯:基於您的OperationContract的方法

,我會指定OperationBehaviour的方法,並根據自己的需要配置完成的交易行爲。

MSDN for ReleaseInstanceOnTransaction - 舉例說明OperationBehaviour應該如何配置爲在基礎操作完成後自動完成交易。

您的OutOfMemoryException的根本原因很可能是未完成事務,因此不會導致WCF ServiceInstance被關閉和垃圾收集。

+0

我有transactionFlow一個操作合同被允許並根據MSDN文檔https://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.releaseserviceinstanceontransactioncomplete(v=vs.110).aspx 如果OperationBehaviorAttribute.TransactionScopeRequired設置爲true,那麼您必須顯式將ReleaseServiceInstanceOnTransactionComplete設置爲false – MKMohanty

+0

如果您發佈該信息,這將有所幫助。如果沒有適當的'OperationContract'方法定義來支持你的問題,那麼使用該配置會導致內存泄漏,因爲每次調用之後你都不會查殺服務實例。我仍然從這些方法開始,以確保服務實例正確關閉。 – toadflakz

+0

我更新了問題,我沒有得到最後一行,服務實例正在正確關閉,如何實現這一目標?你的意思是我不應該使用transactionflowoption.Allowed。 – MKMohanty

相關問題