javascript - werke - the mild mild west




Wie zerstöre ich ein JavaScript-Objekt? (4)

Ich hatte ein Problem wie dieses und hatte die Idee, einfach das innereHTML der Kinder des problematischen Objekts zu ändern.

adiv.innerHTML = "<div...> the original html that js uses </div>";

Scheint dreckig, aber es hat mein Leben gerettet, wie es funktioniert!

Kürzlich stieß ich auf eine meiner Anwendungen, die zu viel Speicher verbraucht und um 10 MB / Sek.

Also, ich mag es, den besten Weg zu wissen, JavaScript-Objekte und Variablen zu zerstören, damit der Speicherverbrauch niedrig bleibt und mein FF nicht zerstört werden kann.

Ich rufe zwei von meinen JavaScript in jedem 8 sec-Intervall, ohne die Seite neu zu laden.

function refresh() {
    $('#table_info').remove();
    $('#table').hide();
    if (refreshTimer) {
        clearTimeout(refreshTimer);
        refreshTimer = null ;
    }
    document.getElementById('refresh_topology').disabled=true; 
    $('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123"));
    $("#topo").hide();
    $('#root').remove();
    show_topology();
}

Wie kann ich sehen, welche Variable Speicheraufwand und Methode verursachen, um die Ausführung dieses Prozesses zu stoppen?


Sie können Objekte nicht löschen, sie werden entfernt, wenn keine Referenzen mehr auf sie vorhanden sind. Sie können Referenzen mit delete .

Wenn Sie jedoch Zirkelverweise in Ihren Objekten erstellt haben, müssen Sie möglicherweise einige Dinge entkoppeln.


Strukturieren Sie Ihren Code so, dass alle temporären Objekte innerhalb von Schließungen statt globaler Namespace- / globaler Objekteigenschaften liegen und dass Sie den Bereich verlassen, wenn Sie damit fertig sind. GC kümmert sich um den Rest.


Während die vorhandenen Antworten Lösungen zur Lösung des Problems und der zweiten Hälfte der Frage gegeben haben, liefern sie keine Antwort auf den Selbstentdeckungsaspekt der ersten Hälfte der Frage, die fett gedruckt ist: "Wie kann ich sehen, welche Variable verursacht? Speicher Overhead ...? "

Es war vielleicht nicht so robust wie vor 3 Jahren, aber die Chrome Devevloper Tools " Profile " Sektion ist jetzt ziemlich mächtig und reichhaltig. Das Chrome-Team hat einen aufschlussreichen Artikel über die Verwendung und damit auch über die Funktionsweise von Garbage Collection (GC) in Javascript, die im Kern dieser Frage steht.

Da delete im Grunde die Wurzel der aktuell akzeptierten Antwort von Yochai Akoka ist, ist es wichtig sich daran zu erinnern, was delete tut. Es ist irrelevant, wenn es nicht mit den Konzepten von GC in den nächsten zwei Antworten kombiniert wird: Wenn ein Verweis auf ein Objekt vorhanden ist, wird es nicht bereinigt. Die Antworten sind korrekter, aber wahrscheinlich nicht so geschätzt, weil sie mehr Nachdenken erfordern, als nur "Löschen" zu schreiben. Ja, eine mögliche Lösung könnte sein, delete zu verwenden, aber es spielt keine Rolle, ob es einen anderen Verweis auf das Speicherleck gibt.

delicateLaticeworkFever erwähnt in angemessener Weise Zirkelverweise und die Dokumentation des Chrome-Teams kann viel mehr Klarheit bieten sowie die Tools zur Überprüfung der Ursache.

Da delete hier erwähnt wurde, kann es auch nützlich sein, die Ressource Understanding Delete bereitzustellen. Obwohl es in keiner der tatsächlichen Lösung, die wirklich mit GC js verwandt ist.





destroy