Die Situation ist, dass ich einen WCF-Aufruf an einen Remote-Server mache, der ein XML-Dokument als Zeichenfolge zurückgibt.Maximieren des größten zusammenhängenden Speicherblocks im Large Object Heap
Die meiste Zeit ist dieser Rückgabewert ein paar K, manchmal ein paar Dutzend K, sehr gelegentlich ein paar hundert K, aber sehr selten könnte es mehrere Megabyte sein (erstes Problem ist, dass es keine Möglichkeit für mich gibt)).
Es sind diese seltenen Gelegenheiten, die Kummer verursachen. Ich bekomme einen Stack-Trace, die beginnt:
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)
Ich habe um zu lesen, und es ist, weil das Large Object Heap ist einfach zu stark fragmentiert bekommen, so der sich in das Gespräch mit einem schnellen Scheck StringBuilder.EnsureCapacity nur bewirkt, dass die OutOfMemoryException früher ausgelöst werden (und weil ich rate, was benötigt wird, benötigt es möglicherweise nicht so viel, so dass mein Check mehr Probleme verursacht, als es löst). Einige opinions sind, dass ich nicht viel dagegen tun kann.
Einige der Fragen, die ich mich gefragt habe:
- Verwenden weniger Speicher - haben Sie auf Lecks überprüft? Ja. Die Speicherauslastung steigt und sinkt, aber es gibt kein grundlegendes Wachstum, das dies garantiert. Manchmal ist es nicht gelungen, zu diesem Zeitpunkt war es erfolgreich.
- Übertragung kleine Mengen nicht möglich ist, ist dies ein Dritte Web-Service, über die ich keine Kontrolle habe (oder zumindest es eine lange Zeit in der Zwischenzeit zu lösen, nehmen würde ich habe immer noch ein Problem)
- Können Sie etwas mit dem LOH machen, damit es weniger wahrscheinlich ausfallen wird? ... jetzt ist dies der fruchtbarste Weg. Es ist ein 32-Bit-Prozess (es muss für verschiedene politische, technische und langweilige Gründe sein), aber es gibt normalerweise Hunderte von Meg frei (Vielfache der größten Menge, für die wir Fehler gesehen haben).
- Können wir die LOH überwachen? Mit perfmon kann ich die Größe der Heaps verfolgen, aber ich glaube nicht, dass es eine Möglichkeit gibt, den größten verfügbaren zusammenhängenden Speicherblock zu überwachen.
Frage ist: irgendwelche Ratschläge oder Vorschläge für Dinge zu versuchen?
Ändern der Bindung ist eine gute Idee - ich werde es versuchen. Ein rollender Recycling war unser letzter Ausweg ... – Unsliced
wir hatten das Glück, alle Probleme mit großen Dokumentenverarbeitung entweder durch Code-Verbesserungen (wir besitzen beide Endpunkte obwohl), oder verbindliche Änderungen, zumindest um uns durch zu kommen zu einem regelmäßig geplanten Wartungs-Recycling (aufgrund von Patches, Feature Release, etc.). @ Steven's Idee der Verwendung von Windbg für Heap-Analyse kann auch Vorteile bringen. Versuchen Sie http://blogs.msdn.com/tess/ und Sie werden gute Informationen von Tess Ferrandez finden, wie Sie hier anfangen können. Ausgezeichnete Labore! Viel Glück! –