這種情況是,我正在對作爲字符串返回XML文檔的遠程服務器進行WCF調用。如何最大化大對象堆中最大的連續內存塊
大部分時間這個返回值是幾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會在更早的時候拋出(並且因爲我在猜測需要什麼,它可能並不需要那麼多,所以我的檢查導致的問題比解決問題的更多)。一些opinions是,我沒有太多的事情可以做。
一些我問自己的問題:
- 使用較少的內存 - 你檢查是否有泄漏?是的。內存使用量上升和下降,但沒有保證這種情況發生的根本性增長。有些時候它失敗了,它在此之前就已經成功了。
- 傳輸少量不是一種選擇,這是一個第三方Web服務在這我管不着(或至少它需要很長的時間來解決,在此期間,我仍然有一個問題)
- 你可以對蕙蘭做些什麼,使它不太可能失敗? ...現在這是最富有成果的課程。這是一個32位程序(它必須出於各種政治,技術和無聊的原因),但通常有數百兆的免費(我們已經看到失敗的最大數量的倍數)。
- 我們可以監控LOH嗎?使用perfmon我可以跟蹤堆的大小,但我不認爲有辦法監視最大的可用連續內存塊。
問題是:任何建議或建議的事情嘗試?
更改綁定是一個好主意 - 我會試試看。 滾動回收是我們的最後手段... – Unsliced 2010-04-22 14:13:35
我們很幸運,通過代碼改進(儘管我們擁有兩個端點)或綁定更改來緩解大文檔處理中的任何問題,至少讓我們通過到定期維護回收(由於修補,功能發佈等)。 @Steven的使用windbg進行堆分析的想法也可以帶來好處。試試http://blogs.msdn.com/tess/,你會發現Tess Ferrandez有關如何從這裏開始的好消息。優秀的實驗室! 祝你好運! – 2010-04-22 14:24:00