这可能与.NET Collections and the Large Object Heap (LOH)
一致在.Net中,我正在加载一个带有字符串的XmlDocument,当xml转换为base64时,该字符串会生成~200KB的文本文档。关键是,字符串应该分配给大对象堆。我从阅读比较中知道,XmlReader是读取字符串的最有效方法,但XmlDocument可能会让我更直接的读取,具有更多功能(xpath)。
我的XML的每个节点都应该是一个相当小的字符串,没有任何东西靠近大对象堆。使用Lutz .Net Reflector,XmlDocument似乎在内部使用链接节点。
最后,我的问题是:在使用XmlDocument时,加载此字符串可以节省~200 KB(> 85000字节)会导致另一个对象到LOH。我们有点担心碎片堆并导致OOM错误。或者XmlDocument刚刚发生(至少在我询问的数据的情况下)为托管堆创建了很多对象?
答案 0 :(得分:3)
这是大于85 kB的连续数据的唯一对象,最终会出现在大对象堆中。例如,大字符串和包含数万个元素的数组。
XmlDocument由许多小对象组成,因此它很少在大对象堆上分配任何东西。唯一的机会是,如果一个节点包含数十个子节点,或者一个值超过42500个字符。
答案 1 :(得分:1)
为什么要将XML加载到字符串中?数据来自哪里?你不能把它(例如Stream
或TextReader
)直接传递到XmlDocument
开始吗?