У меня есть приложение, которое взаимодействует с веб-службами Java с использованием клиентов WCF. Одна из услуг возвращает умеренно большой результат (около 100 Мб), а иногда мы получаем 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, системы. String)
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, Boolean, 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 МБ и ответ aroung 100Mb, так что что-то еще должно происходить.
Любая идея?
Если вы это делаете (часто принимаете 100 Мб), а ваше приложение - 32-битное (почему, кстати?) - ваша память может быть фрагментирована, поэтому нет непрерывного 100 МБ фрагмента доступной памяти. – Evk
Вот хорошая статья по этому поводу: https://blogs.msdn.microsoft.com/ericlippert/2009/06/08/out-of-memory-does-not-refer-to-physical-memory/ – Evk
Фрагментация здесь не имеет значения. Все текущие операционные системы использовали выгружаемую виртуальную память. Фрагментация происходит со смежным распределением. – AhmadWabbi