用AJAX引起的“此页面上的脚本导致IE运行缓慢”的故障排除方法?

时间:2008-12-23 17:06:39

标签: javascript ajax internet-explorer mootools

我的应用程序中有一个页面,每隔10秒从服务器刷新一些内容(当前登录的用户列表)。这些数据是使用Ajax中的mootools framework类加载的,特别是使用类似的Javascript:

var xmldata = (function() {
    new Ajax('xmldata.jsp?time='+$time(), {method: 'get', onComplete: dataLoaded, autoCancel: true}).request();
}).periodical(10000);

(每10秒创建一个Ajax对象,并调用它的request()方法,完成后将调用dataLoaded()方法。

如果用户将浏览器窗口打开此页面大约45-60分钟,那么尝试在其他地方导航将导致IE(v7肯定,v6以及我相信,Firefox或Chrome没有此问题)显示以下弹出窗口:

  

停止运行此脚本?
  此页面上的脚本导致Internet Explorer运行缓慢。   如果它继续运行,您的计算机可能会无响应。

现在,在我看来,这可能是由mootools框架中底层脚本中的某种泄漏引起的 - 要么排队太多Ajax.request()来调用,要么某些对象不正确清理,即使框架应该有一些垃圾收集功能。

分析IE的Javascript引擎在幕后做了什么的最佳方法是什么?有没有办法确定我的假设是否正确?

我在a similar questionsomeone suggested中看到过使用IBM Page Profiler来调试此问题。我尝试使用Page Profiler并没有取得多大成功 - 如果您对页面的初始加载有问题(分析哪个组件导致过多的加载延迟)似乎很有用但似乎没有能够分析完全加载后在页面中运行的Javascript所发生的事情。我在Page Profiler中看到,每隔10秒就会请求对xmldata.jsp的异步调用,但是Page Profiler只显示服务器响应正常(大约600毫秒),但没有深入了解父页面脚本如何使用这些数据。 / p>

此外,{_ 3}}在关闭的mootools讨论列表中,有人建议删除注册unload侦听器的代码来调用垃圾收集方法来解决此问题 - 但这似乎就像解决问题的症状,而不是问题本身。

2 个答案:

答案 0 :(得分:4)

这可能是IE中的内存/资源泄漏。这些中最常见的来源是代码或框架代码中的闭包。我总是检查我的javascript框架的问题跟踪器报告的错误。很多时候我被bug报告和保存所保存。来自其他用户的修复。

要尝试跟踪问题,您可以尝试使用ie leak detector之类的内容。有一个很好的msdn article解释了IE内存泄漏的理论。

丰富的泄漏源是事件处理程序,您确实需要阅读MSDN文章才能理解这一点。这些通常会造成您的类型泄漏,因此查看取消注册任何事件处理程序可能是一个好主意。

我必须承认,每10秒钟连续重装一小时听起来相当不错;我不确定你是否应该期待 IE变得更好(可能有点偏低,但仍然)。您可能需要调整您的期望,或者至少设定一个目标,即在单个版本的IE上更好地运行。

Re expect:对于IE的“通用”版本,有太多不同的版本,有太多不同的错误,你可以在所有这些版本上为长期运行的应用程序提供100%的稳定性。所以至少在最初我认为选择特定版本作为目标是明智的。

答案 1 :(得分:0)

首先,您可能希望通过让它运行一小时来检查泄漏,并查看IE内存使用量是否显着增加。另一个问题可能是IE有某种内部计数器,它计算javascript在页面上使用的总时间,然后如果你使用超过x秒则显示警告。即使每个请求不使用大量CPU,在一个小时内,它可能会使用很多,因此IE可能会将此检测为问题。另外,我不熟悉mootools,但您可能希望确保使用异步AJAX调用,以最大限度地减少javascript代码中的等待时间。