MSXML和.NET - 内存使用

时间:2012-06-07 02:08:44

标签: .net msxml

我一直在对供应商编写的生产Web应用程序(.NET 4)进行故障排除。

过去几周,我们一直在使用此网站遇到一些速度问题。

最初,重点是数据库方面。现在,我觉得可以轻松地将这部分内容排除在外...我今天花了很多时间调试Web应用程序,看看实际的速度问题来自哪里。

我发现在Web应用程序的这个特定部分中,它会打开一个新的Internet Explorer窗口,以显示从数据库返回的大量XML数据。

查看代码并使用调试器试图弄清楚发生了什么......这是我发现的:

当完成此特定页面上的代码填充所有内容时,iexplore进程的私有工作集为692,044K。这似乎是msxml3.dll的众多进程中activex控件的结果。

经过一番研究,我发现了这篇微软文章: http://support.microsoft.com/?scid=kb%3Ben-us%3B815112&x=15&y=14

它说: “Microsoft不支持在.NET应用程序中使用MSXML(Microsoft的基于COM的XML解析器)。 MSXML使用与.NET Framework不兼容的线程模型和垃圾收集机制。通过COM互操作性在.NET应用程序中使用MSXML可能会导致难以调试的意外问题。 Microsoft不建议或支持在.NET代码中直接实例化和使用MSXML对象,Microsoft也不建议或支持跨互操作边界编组MSXML接口指针。“

这是创建activex对象的代码的一部分:

                var oTmp = new ActiveXObject("MSXML2.Domdocument");
                oTmp.loadXML('<plan_data>' + returnValue + '</plan_data>');

当内存增加时,进程资源管理器会将多个MSXML3.dll加载到iexplore进程中。即使关闭了这个特定的窗口,它似乎也没有正确清理,因为它仍然使用大约220,000 K的内存。(可能是由于上面列出的垃圾收集机制)。

所以,我的问题是......在这里,如果这看起来像是一个设计不佳的网络应用程序部分,那么这里的任何人都可以提供一些建议吗?

我希望能够将这些信息提供给开发人员并让他们看看,但我希望有人能先给我一些专业建议。

谢谢。

2 个答案:

答案 0 :(得分:1)

每次将大型XML结构处理到内存中然后对其进行操作时,它都是一个相当占用内存的操作。如果您确实需要将整个文档保存在内存中,请查看使用System.Xml.Linq命名空间中的XDocument替换当前代码。

如果您只需要流式传输一次XML文档,在阅读每个节点时执行操作,请查看Streaming Transform of Large XML Documents

修改

@Yahia提出了一个很好的观点,我错过了......这段代码似乎是在客户端执行的。是这样的吗?如果是这样,为什么不让IE(你的ActiveX只能在IE中运行,其他一些带有插件的浏览器;-)显示生成的XML。如果XML不是太大,它可以很好地完成它(虽然几MB以上需要很长时间才能进行初始处理)。

答案 1 :(得分:0)

您显示的代码似乎是在浏览器中执行的JavaScript代码......在这方面,上面提到的知识库文章不适用于您的情况...说:加载“大量”是不好的设计XML“进入浏览器 - 正如你所发现的那样。”

解决方案可能是使用基于服务器的分页机制和/或在UI中提供一些过滤机制,这样就不会出现完整的XML需要在浏览器中出现的情况......