4

我的应用程序中有一个页面,它每 10 秒从服务器刷新一些内容(当前登录的用户列表)。该数据是使用mootools 框架中的Ajax类加载的,特别是使用如下所示的 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 引擎在幕后做了什么的最佳方法是什么?有没有可能的方法来确定我的任何一个假设是否正确?

我在一个类似的问题中看到,有人建议使用 IBM Page Profiler 来调试这个问题。我已经尝试使用 Page Profiler 并没有取得太大的成功 - 如果您在页面的初始加载时遇到问题(分析哪个组件导致过度加载延迟),它似乎很有用,但它似乎没有能够分析在页面完全加载后在页面内运行的 Javascript 发生了什么。我在 Page Profiler 中看到每 10 秒请求一次对 xmldata.jsp 的异步调用,但 Page Profiler 仅显示服务器响应正常(大约 600 毫秒),但不了解父页面的脚本如何使用此数据。

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

4

2 回答 2

4

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

要尝试跟踪问题,您可以尝试诸如泄漏检测器之类的方法。有一篇很棒的msdn 文章也解释了 IE 内存泄漏的理论。

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

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

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

于 2008-12-23T17:15:36.297 回答
0

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

于 2008-12-23T18:00:05.583 回答