我们的服务器在生产环境中运行,但在运行几天后,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)]
我是否在配置过程中遗漏了一些内容,纠正或识别此内存异常的步骤是什么,我们非常感谢您对此事的任何帮助。
更新: 运营合同:
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
答案 0 :(得分:2)
是的,您的配置就是问题。
这就是您的配置意味着:
InstanceContextMode = InstanceContextMode.PerCall
- 为每次对服务的调用启动一个新的服务实例。
ConcurrencyMode = ConcurrencyMode.Multiple
- 允许多个线程在服务实例中启动
ReleaseServiceInstanceOnTransactionComplete = false
- 调用完成后不要释放服务实例。
修改强>
根据方法的OperationContract
,我会为方法指定OperationBehaviour
,并根据您的需要配置交易完成行为。
MSDN for ReleaseInstanceOnTransaction - 有一个很好的例子说明OperationBehaviour
应该如何配置为在基础操作完成后自动完成事务。
OutOfMemoryException
的根本原因很可能是没有完成事务,因此不会导致WCF ServiceInstance
被关闭和垃圾回收。