私は、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 600メガバイトと応答がaroungです - アプリケーションは約400を消費する32ビットアプリケーションであるとしてデータの)
当社のWCFクライアント....
量は、実際のOutOfMemoryExceptionを作成するのに十分な大きさではありません何か他のことが起こっているはずです。
あなたは100MBの容量のチャンクを頻繁に受信し、アプリケーションは32ビット(なぜですか?)の場合、メモリが断片化する可能性があるため、100MBの連続したメモリがありません。 – Evk
ここでこれについての良い記事です:https://blogs.msdn.microsoft.com/ericlippert/2009/06/08/out-of-memory-does-not-refer-to-physical-memory/ – Evk
フラグメンテーションはここでは無関係です。現在のオペレーティングシステムはすべて、ページングされた仮想メモリを使用していました。断片化は、連続した割り当てで発生します。 – AhmadWabbi