这种情况是,我正在对作为字符串返回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