Ситуация такова, что я делаю вызов WCF удаленному серверу, который возвращает XML-документ в виде строки.
В большинстве случаев это возвращаемое значение составляет несколько K, иногда несколько десятков K, очень редко несколько сотен K, но очень редко это может быть несколько мегабайт (первая проблема в том, что у меня нет никакого способазнать).
Именно эти редкие случаи вызывают горе.Я получаю трассировку стека, которая начинается:
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Xml.BufferBuilder.AddBuffer()
at System.Xml.BufferBuilder.AppendHelper(Char* pSource, Int32 count)
at System.Xml.BufferBuilder.Append(Char[] value, Int32 start, Int32 count)
at System.Xml.XmlTextReaderImpl.ParseText()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Xml.XmlReader.ReadElementString()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderMDRQuery.Read2_getMarketDataResponse()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer2.Deserialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
Я прочитал, и это потому, что куча больших объектов становится слишком фрагментированной, поэтому даже перед вызовом с быстрой проверкой StringBuilder.EnsureCapacity простоприводит к тому, что OutOfMemoryException генерируется раньше (и потому что я догадываюсь о том, что нужно, на самом деле это может не понадобиться так сильно, поэтому моя проверка вызывает больше проблем, чем решает).Некоторые мнения таковы, что я мало что могу с этим поделать.
Некоторые вопросы, которые я задавал себе:
- Использовать меньше памяти - проверяли ли вы на утечки? Да.Использование памяти идет вверх и вниз, но нет фундаментального роста, который бы гарантировал это.В некоторых случаях это терпит неудачу, но раньше это удавалось.
- Перевести меньшие суммы Не вариант, это сторонний веб-сервис, который я не могу контролировать (или, по крайней мере, это займет много времени, пока я все ещеесть проблема)
- Можете ли вы что-то сделать с LOH, чтобы уменьшить вероятность его отказа? ... теперь это наиболее плодотворный курс.Это 32-битный процесс (он должен быть по разным политическим, техническим и скучным причинам), но обычно он свободен на сотни мегабайт (кратно наибольшему количеству, в котором мы видели сбои).
- Можем ли мы отслеживать LOH? Используя perfmon, я могу отслеживать размер кучи, но я не думаю, что есть способ контролировать самый большой доступный непрерывный блок памяти.
Вопрос: какие-либо советы или предложения для вещей, чтобы попробовать?