2015-09-28 62 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