我一直在对供应商编写的生产 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 不兼容的线程模型和垃圾收集机制。在 .NET 应用程序中使用 MSXML通过 COM 互操作性可能会导致难以调试的意外问题。Microsoft 不建议或不支持在 .NET 代码中直接实例化和使用 MSXML 对象,也不建议或支持跨互操作边界编组 MSXML 接口指针。
这是创建 activex 对象的代码的一部分:
var oTmp = new ActiveXObject("MSXML2.Domdocument");
oTmp.loadXML('<plan_data>' + returnValue + '</plan_data>');
随着内存的增加,进程资源管理器会拾取几个加载到 iexplore 进程中的 MSXML3.dll。即使在关闭此特定窗口后,它似乎也无法正确清理自身,因为它仍然使用大约 220,000 K 的内存。(可能是由于上面列出的垃圾收集机制)。
所以,我的问题是......这里有熟悉这个的人可以就这是否看起来像是 Web 应用程序的一个设计不佳的部分提供一些建议吗?
我希望能够将此信息带给开发人员并让他们查看,但我希望有人可以先给我一些专业建议。
谢谢你。