3

我有一个巨大的网络应用程序,它在 IE 6 中存在内存泄漏问题。

在演示问题的 5 行代码示例中修复内存泄漏很容易。

但是如果我有一个非常庞大的应用程序,应该从哪里开始呢?

4

3 回答 3

7

检查。这通常可以消除 IE 内存泄漏的猜测。

如果由于某种原因 Drip 没有找到它,请仔细查看任何适用于事件的 JavaScript 代码。这几乎总是浏览器中任何重大内存泄漏的根源。

销毁附加了处理程序的 DOM 元素,而不首先删除这些处理程序,将阻止与这些处理程序关联的内存被恢复。

于 2008-08-21T12:59:03.173 回答
1

应用程序是否使用大量 JavaScript?

如果确实如此,那么我发现有助于避免内存泄漏的一件事是确保您使用的是 JavaScript 框架,例如 Prototype 或 jQuery,因为他们已经尝试并测试了不会泄漏内存的事件处理代码。

于 2008-08-21T13:03:17.640 回答
0

以下是我如何解决 IE7 中的内存泄漏问题。这个想法是在卸载页面时将所有 DOM 节点上的所有扩展属性都设置/设置为空。这对我有用。您可能会发现它很有用。

<!--[if lt IE 8]>
<script type="text/javascript">

function disposeAll() {
    if (window.document.all) {
        for (var index = 0; index < window.document.all.length; index++) {
            try { dispose(window.document.all[index], []); } catch (e) { debugger; }
        }
    }
    dispose(window.document.body, []);
    dispose(window.document, []);
    dispose(window, []);
    window.disposeAll = null;
    window.dispose = null;
    window.onunload = null;
}

function dispose(something, map) {
    if (something == null) return;
    if (something.dispose && typeof (something.dispose) == 'function') {
        try { something.dispose(); } catch (e) { debugger; }
    }
    map.push(something);
    for (var key in something) {
        var value = null;
        try { value = something[key]; } catch (e) { };
        if (value == null || value == dispose || value == disposeAll) continue;

        var processed = null;
        for (var index = 0; index < map.length; index++) {
            if (map[index] === value) {
                processed = value;
                break;
            }
        }
        if (processed != null) continue;
        var constructor = value.constructor;
        if (constructor == Object || constructor == Array) {
            try { dispose(value, map); } catch (e) { debugger; }
        }
        if (constructor == Object || constructor == Array || constructor == Function) {
            try { something[key] = null; } catch (e) { debugger; }
        }
    }
    map.pop();
}

(function() {
    var previousUnloadHandler = window.onunload;
    if (previousUnloadHandler == null) {
        window.onunload = disposeAll;
    } else {
        window.onunload = function() {
            previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED
            disposeAll();
            previousUnloadHandler = null;
        };
    }
}());

</script>
<![endif]-->

您可能想要删除所有“调试器;” 如果您不想处理一些偶然的例外情况,请声明。

于 2012-03-01T16:27:02.307 回答