【问题标题】:Methods for troubleshooting "A script on this page is causing IE to run slowly" caused by AJAX?AJAX引起的“此页面上的脚本导致IE运行缓慢”的故障排除方法?
【发布时间】:2008-12-23 17:06:39
【问题描述】:

我的应用程序中有一个页面,它每 10 秒从服务器刷新一些内容(当前登录的用户列表)。该数据是使用来自mootools frameworkAjax 类加载的,特别是使用如下所示的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 毫秒),但不了解父页面的脚本如何使用此数据。

此外,in this post 在自关闭的 mootools 讨论列表中,有人建议删除注册 unload 侦听器以调用垃圾收集方法来解决此问题的代码 - 但这似乎解决了问题而不是问题本身。

【问题讨论】:

    标签: javascript ajax internet-explorer mootools


    【解决方案1】:

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

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

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

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

    重新期望:对于“通用”版本的 IE,有太多不同的版本和太多不同的错误,您可以在所有这些版本上针对长时间运行的应用程序实现 100% 的稳定性。所以至少一开始我认为选择一个特定的版本作为目标是明智的。

    【讨论】:

    • ie 检漏仪看起来很有前途,谢谢。您能否进一步解释一下您对 IE 良好行为的期望的最后一点是什么意思?我更担心 IE 用户收到此弹出消息,而不是内存泄漏本身
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2011-08-07
      • 1970-01-01
      相关资源
      最近更新 更多