我有一个使用WCF客户端与Java web服务进行通信的应用程序。该业务之一返回一个中等大的结果(约100 MB),有时我们得到一个OutOfMemoryException:OutOfMemoryException从WebServices接收数据
System.IO.MemoryStream.set_Capacity(Int32)已
System.IO.MemoryStream.EnsureCapacity(Int32)已
System.IO.MemoryStream.Write(字节[],的Int32,Int32)将
System.Xml.XmlMtomReader + MimePart.GetBuffer(的Int32,的Int32的ByRef)
System.Xml.XmlMtomReader.Initialize(System.IO.Stream, System.String, System.Xml.XmlDictionaryReaderQuotas,Int32)
System.Xml.XmlMtomReader.SetInput(System.IO.Stream, System.Text.Encoding [],System.String, System.Xml.XmlDictionaryReaderQuotas,的Int32, System.Xml.OnXmlDictionaryReaderClose)
System.ServiceModel.Channels.MtomMessageEncoder.TakeStreamedReader(System.IO.Stream, 系统。字符串)
System.ServiceModel.Channels.MtomMessageEncoder.ReadMessage(System.IO.Stream, 的Int32,System.String)
System.ServiceModel.Channels.HttpInput.ReadStreamedMessage(System.IO.Stream) System.ServiceModel。 Channels.HttpInput.ParseIncomingMessage(System.Exception ByRef)
System.ServiceModel.Channels.HttpChannelFactory + Ht tpRequestChannel + HttpChannelRequest.WaitForReply(System.TimeSpan) System.ServiceModel.Channels.RequestChannel.Request(System.ServiceModel.Channels.Message, System.TimeSpan)
System.ServiceModel.Dispatcher.RequestChannelBinder.Request(System.ServiceModel。 Channels.Message, System.TimeSpan)
System.ServiceModel.Channels.ServiceChannel.Call(System.String, 布尔,System.ServiceModel.Dispatcher.ProxyOperationRuntime, System.Object的[],System.Object的[],系统.TimeSpan)
System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage, System.ServiceModel.Dispatcher.ProxyOperat ionRuntime)
System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage) System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData 的ByRef,的Int32 )
我们WCF客户....
的数据量不够大的应用是创建一个真正的OutOfMemoryException异常32位应用程序耗时约400 - 600 MB和响应aroung 100Mb,所以其他事情必须发生。
有什么想法?
如果你经常这样做(接收100mb大块),你的应用程序是32位的(为什么顺便说一下)?你的内存可能会被分割,因此没有_continuous_ 100MB的可用内存。 – Evk
这是一个很好的文章:https://blogs.msdn.microsoft.com/ericlippert/2009/06/08/out-of-memory-does-not-refer-to-physical-memory/ – Evk
碎片在这里是无关紧要的。所有当前的操作系统都使用分页虚拟内存。碎片化发生在连续的分配中。 – AhmadWabbi