我一直在对供应商编写的生产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的内存。(可能是由于上面列出的垃圾收集机制)。
所以,我的问题是......在这里,如果这看起来像是一个设计不佳的网络应用程序部分,那么这里的任何人都可以提供一些建议吗?
我希望能够将这些信息提供给开发人员并让他们看看,但我希望有人能先给我一些专业建议。
谢谢。
答案 0 :(得分:1)
每次将大型XML结构处理到内存中然后对其进行操作时,它都是一个相当占用内存的操作。如果您确实需要将整个文档保存在内存中,请查看使用System.Xml.Linq
命名空间中的XDocument替换当前代码。
如果您只需要流式传输一次XML文档,在阅读每个节点时执行操作,请查看Streaming Transform of Large XML Documents。
修改强>
答案 1 :(得分:0)
您显示的代码似乎是在浏览器中执行的JavaScript代码......在这方面,上面提到的知识库文章不适用于您的情况...说:加载“大量”是不好的设计XML“进入浏览器 - 正如你所发现的那样。”
解决方案可能是使用基于服务器的分页机制和/或在UI中提供一些过滤机制,这样就不会出现完整的XML需要在浏览器中出现的情况......