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

Javascript “故障排除方法”;此页面上的脚本导致IE运行缓慢;由AJAX引起的?,javascript,ajax,internet-explorer,mootools,Javascript,Ajax,Internet Explorer,Mootools,我的应用程序中有一个页面,每10秒刷新服务器上的一些内容(当前登录的用户列表)。此数据使用来自的类加载,特别是使用如下所示的Javascript加载: var xmldata = (function() { new Ajax('xmldata.jsp?time='+$time(), {method: 'get', onComplete: dataLoaded, autoCancel: true}).request(); }).periodical(10000); (它每10秒创建一个A

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

我在中看到了这一点,使用IBMPage Profiler来调试这个问题。我尝试过使用页面探查器,但没有取得太大的成功——如果页面的初始加载有问题(分析哪个组件导致过度加载延迟),它似乎很有用,但它似乎无法分析页面完全加载后Javascript在页面内运行的情况。我在PageProfiler中看到,对xmldata.jsp的异步调用每10秒被请求一次,但是PageProfiler只显示服务器响应正常(大约600毫秒),但没有深入了解父页面的脚本如何使用这些数据


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

这可能是IE中的内存/资源泄漏。最常见的原因是代码或框架中的闭包代码。我总是在问题跟踪器中检查javascript框架是否有报告的bug。很多次我都被其他用户的bug报告和修复程序保存了下来

要尝试跟踪问题,可以尝试以下方法。还有一个极好的例子解释了IE内存泄漏的理论

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

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


再次期待:对于IE的“通用”版本,有太多不同的版本,有太多不同的bug,您可以在所有这些版本上为长期运行的应用程序提供100%的稳定性。因此,至少在一开始,我认为选择一个特定版本作为目标是明智的。

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

ie泄漏检测器看起来很有希望,谢谢。你能进一步解释一下你最后一点关于IE良好行为期望的意思吗?我更担心IE用户收到这个弹出消息,而不是内存泄漏本身