Frage

Ich habe eine riesige Web-App, die Probleme mit Speicherverlusten in IE 6 hat.

Das Beheben eines Speicherlecks in einem 5-Zeilen-Codebeispiel, das das Problem verdeutlicht, ist einfach.

Aber wo sollte ich anfangen, wenn ich eine sehr umfangreiche Anwendung habe?

War es hilfreich?

Lösung

Kasse Tropfen.Dadurch entfällt in der Regel das Rätselraten bei IE-Speicherlecks.

Wenn Drip es aus irgendeinem Grund nicht findet, schauen Sie sich den JavaScript-Code, der mit Ereignissen funktioniert, genau an.Dies ist fast immer die Ursache für einen erheblichen Speicherverlust in einem Browser.

Wenn Sie ein DOM-Element mit angehängten Handlern zerstören, ohne diese Handler zuerst zu entfernen, wird verhindert, dass der mit diesen Handlern verbundene Speicher wiederhergestellt wird.

Andere Tipps

Verwendet die Anwendung viel JavaScript?

Wenn dies der Fall ist, hilft es meiner Meinung nach, Speicherlecks zu vermeiden, indem Sie sicherstellen, dass Sie ein JavaScript-Framework wie Prototype oder jQuery verwenden, da diese über bewährten Event-Handling-Code verfügen, der keinen Speicherverlust verursacht.

So habe ich das Speicherverlustproblem in IE7 gelöst.Die Idee besteht darin, beim Entladen der Seite alle Expando-Eigenschaften auf allen DOM-Knoten zu löschen bzw. auf Null zu setzen.Das hat bei mir funktioniert.Möglicherweise finden Sie es nützlich.

<!--[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]-->

Vielleicht möchten Sie alle "Debugger" entfernen; Aussagen, wenn Sie nicht mit gelegentlichen Ausnahmen umgehen möchten.

Sie verlieren Speicher aus Java-Funktionen?

Hier ist eine Lösung:Nehmen Sie Ihr Homebrew-Java und schmeißen Sie es weg.Verwenden Sie eines der Standard-Javascript-Frameworks, z. B. jQuery.

Wenn Sie komplexes Javascript erstellen und kein Java-Guru sind, tun Sie es nicht selbst.

Bearbeiten:Was, ist das ein schlechter Rat?Javascript ist nicht nur eine einfache Skriptsprache;Es handelt sich um eine komplexe und überraschend leistungsfähige Programmiersprache, die eng mit dem HTML-DOM verknüpft ist, das in verschiedenen Browsern unterschiedlich implementiert wird.Wenn Sie es falsch machen, verlieren Sie nicht nur Speicher, sondern werfen auch überall Fehler aus und machen das Surferlebnis im Allgemeinen schrecklich.Möchten Sie die Besucher Ihrer Website vertreiben?NEIN?Dann verwenden Sie ein Javascript-Framework und beseitigen Sie all Ihren hackigen Cross-Browser-Bullshittering.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top