Speicher-Leck in der javascript-bei der Verwendung von new Image()
Habe ich anscheinend ein Speicher-Leck, verursacht durch die Verwendung des 'new Image () in einem javascript-Skript. Wenn ich mir die verwendete physikalische Speicher in der windows-Ressourcen-monitor, bekomme ich die erwartete Anstieg der in-memory verwendet, wenn ich die Seite geladen werden, weil es lädt einige ziemlich große Bilder mit wie folgt:
var imgObjs = [];
//in for loop i = 0, 1, 2...
imgObjs[i] = new Image();
imgObjs[i].onload = function(event) {
//image loaded
}
imgObjs[this.img_src].src = this.img_src;
Hätte ich, dass, wenn die Seite navigiert Weg von dieser würde zerstört automatisch die Referenzen und freien Speicher, aber dies scheint nicht der Fall zu sein. Stattdessen habe ich navigieren Weg und dann gehen Sie zurück zu der Seite, nur die finden den Speicher aufstocken, noch mehr als es lädt die Bilder wieder, ohne jemals zu befreien, der zuvor reservierten Speicher. Ich habe versucht, manuell entfernen von verweisen, indem Sie code in das unload-Ereignis, um dies zu tun, aber es scheint nicht zu keinen Unterschied machen. Die Variablen wurden alle erklärt zunächst mit 'var':
//allow garbage collection by removing references
$(window).unload(function() {
for(var i in imgObjs) {
imgObjs[i] = null;
delete imgObjs[i];
}
delete imgObjs
//delete other variables that reference the images
});
hat jemand irgendwelche Hinweise, wie und wo ich bin läuft hier falsch? Ich dachte, das problem könnte sein, zu tun, mit Zirkelbezügen als ich gebaut habe, eine Liste der Klasse, wo jedes Element enthält einen Verweis auf das Vorherige und nächste Bild, aber ich habe deeted diese wie folgt:
delete galleries[i].pictures.Items[j].prev;
delete galleries[i].pictures.Items[j].next;
- möglich, Duplikat der Javascript + IMG-tags = Speicher-Leck. Gibt es einen besseren Weg, dies zu tun?
- Sie habe fünf Fragen gestellt, die hier auf SO und hat NIE akzeptiert, eine als die beste Antwort. Bitte korrigieren Sie das, oder die Leute ignorieren Ihre Fragen.
- Wusste gar nicht, dass war, wie es funktionierte. Ich werde das jetzt tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten aus, es gibt keine browser, die ich kenne, die Lecks, wenn Sie wechseln zu einer anderen Seite, nur weil man gespeicherte Bilder in ein JS-array.
Gibt es einige ältere Browser, die Auslaufen, wenn Sie zirkuläre Verweise zwischen DOM <==> JS wo einige javascript bezieht sich auf ein DOM-element und ein benutzerdefiniertes Attribut auf das DOM-element bezieht sich auf die gleichen javacript Objekt, aber das scheint nicht das zu sein, was Sie hier haben.
Also ... ich wäre erstaunt, wenn das, was Sie sehen, ist tatsächlich ein Leck im gehen von einer Seite zur nächsten. Wenn Sie davon überzeugt sind, dann erstellen Sie entweder einen nur-web-Seite, die Sie mit uns teilen könnt oder ein jsFiddle zeigt, dass die Frage und sagen Sie uns, was exakt die browser, die Sie testen wollen und genau wie Sie sind die Messung der Speicherauslastung, das bestimmt, Sie haben ein Leck.
Es wirklich ein Leck, müssen Sie konsequent finden Sie unter memory-Nutzung gehen bis und und bis und bis, jedes mal, wenn Sie gehen auf die Seite, immer und immer wieder. Nur weil die Speicherauslastung ist etwas höher als die zweite Zeit, die Sie gehen Sie zu der Seite, bedeutet nicht, Sie haben ein Leck. Der browser hat einige Datenstrukturen, die wachsen (um einen Punkt) mit der Nutzung wie der memory-cache, der Sitzung den Browserverlauf, etc..., die sind kein Indikator für Lecks.
Zweiten aus, ich sehe nichts in den Daten Strukturen, die Sie gezeigt haben, dass sind beispielhaft für die Art von zirkulären Referenzen, die bekannt sind, um zu verursachen Lecks in älteren Browsern.
Dritten aus, die
delete
Betreiber ist für das entfernen von Eigenschaften von einem Objekt. Das ist alles, es ist für. Siehe diese Artikel: Grundlegendes Zu Löschen und MDN Löschen für viel mehr Erklärung. So, Ihr cleanup-code in das unload-handler nicht mitdelete
richtig. Sie können nicht löschen, Variable oder array-Elemente mitdelete
. Aber ich sehe keinen Grund, warum dieser code ist notwendig, wenn Sie im Begriff waren, es zu haben, es wäre so: