IE6帧和内存泄漏

Dou*_*ver 22 jquery jquery-ui frames internet-explorer-6

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

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

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

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

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

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

  1. 我已经在IE9上对此进行了测试,问题仍然存在,但是更加可控

  2. 重新设计应用程序需要大约50万美元和6-12个月.

有谁知道解决"框架泄漏"问题的方法?我知道我没有提供任何代码示例,但我只是在寻找一般知识.我CollectGarbage()在onload和onunload上为应用程序中的每个页面调用IE 方法,但无济于事.我试过empty()在jQuery中调用该方法.我已经尝试将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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有没有人知道如何控制框架内存而不刷新它?

Dou*_*ver 2

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

  1. 我没有在需要 UI 元素的页面上使用完整的 jQueryUI 库,而是使用了单独的最小化脚本(uicore + datepicker 等)。
  2. 只要有可能,我都会避免使用小部件脚本的 UI 元素,因为这是问题最集中的地方。
    • A。这导致我必须为button元素和accordion元素编写自定义脚本。
  3. 由于该应用程序在 中运行frameset,因此使用window方法(即 、window.onloadwindow.onunload不起作用,因为窗口本身仅使用 来加载或卸载frameset。为了解决这个问题,我document.body具体实现了一些方法,document.body.onbeforeunload并进行全局解除绑定以删除任何挂出的引用 ( $("*").unbind();)。

通过上述方法,我在 IE6(和 IE8)中的 4 小时内存消耗已从约 200-250Mb 下降到约 80-95Mb。我的目标是将 8 小时的消耗保持在 150Mb 以下,我认为这可以完成任务。

感谢大家的帮助。