IE6框架&内存泄漏

时间:2012-03-09 14:40:16

标签: jquery jquery-ui frames internet-explorer-6

在我开始这个问题之前,我明白它的每个方面都是错误的。请记住这一点......

我有一个CRM-ish内部网应用程序,带有我在2001年开发的集成软电话。它基本上是一个集合应用程序,它将电话控制与基于Web的前端集成,用于帐户管理。 (Genesys电话和基于AS400的集合系统......使用MQSeries)

在我称之为“生命终结”之前,我正试图尽可能地对这个应用程序进行现代化。作为我尝试对其进行现代化的一部分,我实现了jQuery&我的JS功能和UI的jQuery UI。我不是很疯狂,但它根深蒂固。

现在,输入问题:我们目前使用IE6,应用程序是使用框架构建的。 jQuery库的实现从内存的角度揭示了应用程序的筛选性质。它目前在启动时消耗大约75Mb的内存,并在大约2-3小时后增长到150Mb到300Mb。然后浏览器崩溃了。

我已将内存泄漏范围缩小到帧之间的串扰。我已经在sIEve和Drip中单独测试了页面,并且没有发现泄漏。但访问框架集内的页面,这是一个定时炸弹。

我知道答案是重新设计没有框架的应用程序并开始使用更好的浏览器。这有两个问题:

  1. 我已经在IE9上对此进行了测试,问题仍然存在,但有一点 更受控制

  2. 重新设计申请需要大约50万美元和6-12个月。

  3. 有谁知道解决“框架泄漏”问题的方法?我知道我没有提供任何代码示例,但我只是在寻找一般知识。我在onload和onunload上为应用程序中的每个页面调用IE CollectGarbage()方法,但无济于事。我试过在jQuery中调用empty()方法。我已尝试将document.body元素的每个孩子设置为null。什么都行不通。

    我不愿意退出所有这些变化,因为实际上已经实现了一些相当大的成本削减功能。

    附加信息

    我已经设法确定了发生内存泄漏的情况。我认为这是帧之间的“串扰”,但似乎刷新单帧时会发生内存泄漏。

    我设置了一个基本框架集,其中包含同一页面的5个实例(我非常确定每个sIEve没有泄漏)。

    <html>
        <head>
            <title>Frame Leak Test</title>
        </head>
        <frameset cols="*" rows="50%,50%" frameborder="1">
            <frameset cols="33%,33%,34%" rows="100%">
                <frame src="http://npasappgeneqa02/live/" />
                <frame src="http://npasappgeneqa02/live/" />
                <frame src="http://npasappgeneqa02/live/" />
            </frameset>
            <frameset cols="50%,50%" rows="100%">
                <frame src="http://npasappgeneqa02/live/" />
                <frame src="http://npasappgeneqa02/live/" />
            </frameset>
        </frameset>
    </html>
    

    正在加载的索引页面显示sIEve中没有泄漏。

    当我在sIEve中加载框架集页面并单击自动刷新时,没有报告内存泄漏。但是,如果我右键单击 - &gt;刷新单个框架,DOM中75%的已加载项目被列为泄漏。

    显然,自动刷新相当于F5 / shift + F5刷新。这清除了页面的内存。但是当重新加载单个帧时,内存永远不会清除......显然。我的用户必须看到的每个屏幕都会重新加载到主框架中。

    我不能简单地刷新框架集,因为框架集中有一个软件电话,如果刷新或注销不正确,它将带来Armageddon。

    有没有人知道如何在不刷新的情况下控制框架内存?

3 个答案:

答案 0 :(得分:2)

您没有发布任何代码来判断这一点......但是许多这些情况都是由于不正确地使用闭包造成的。

阅读包括但不限于:

答案 1 :(得分:2)

只想提供有关此特定情况的最新信息。我认为我找到了一个可接受的解决这个内存泄漏问题的方法:

  1. 我没有在需要UI元素的页面上使用完整的jQueryUI库,而是使用了各个最小化的脚本(uicore + datepicker等)。
  2. 尽可能避免使用小部件脚本的UI元素,因为这是问题最集中的地方
    • 一个。这导致我必须为button元素和accordion元素编写自定义脚本。
  3. 由于此应用程序在frameset中运行,因此使用window方法(即window.onloadwindow.onunload)不起作用,因为窗口本身仅加载或卸载frameset。为了解决这个问题,我实施了document.body方法,特别是document.body.onbeforeunload并执行全局解除绑定以删除任何挂出的引用($("*").unbind();)。
  4. 使用上面使用的方法,我在IE6(和IE8)中的4小时内存消耗从~200-250Mb下降到~80-95Mb。我的目标是将8小时的消耗量保持在150Mb以下,我认为这将完成任务。

    感谢所有人的帮助。

答案 2 :(得分:0)

我建议通过JSLintJSHint运行您的JS代码。

这两个实用程序(*)是Javascript的代码质量检查器。他们抱怨的东西是JS代码有效但包含糟糕的编程实践的地方。

他们很有可能至少会找到导致你出现问题的一些事情。

(* JSHint是JSLint的一个分支,但它们已经完全不同了,因为它们值得尝试它们)