Getestet in Chrome neuesten und anderen Browsern. Diese Seite startet ein timer()
, um alle 60 Sekunden zu aktualisieren. Bei init()
und jedem refresh()
werden Daten vom Server abgerufen und auf der Seite angezeigt. Wir sehen, dass bei jeder Aktualisierung viele MB verloren gehen.
Wie identifiziere ich nun die spezifischen Objekte und / oder DOM-Knoten, die durchgesickert sind
Sobald ich das Objekt / Knoten aus # 1 identifiziert habe, wie gehe ich vor, um die Lecks zu beheben?
Gibt es Bücher, gute Tutorials, die das oben genannte für Angularjs 1.5 abdecken?
Sie haben wahrscheinlich Ссылка und Ссылка , da es keine detailliertere Ressource gibt.
Ein DOM-Knoten kann nur dann als Garbage Collection erfasst werden, wenn weder von der DOM-Struktur der Seite noch von JavaScript-Code Verweise darauf vorhanden sind. Ein Knoten wird als "detached" bezeichnet, wenn er aus der DOM-Struktur entfernt wird. Abgelöste DOM-Knoten sind eine häufige Ursache für Speicherverluste.
Wenn Sie keine Referenz des Timers halten, sondern bei jedem Auffrischungsleck einen neuen Timer erstellen, der durch die Wiederverwendung von $timeout
Checkout - STRG + F $scope is retained by a context for a closure.
auf dem zweiten angegebenen Link. Der dort erläuterte Anwendungsfall ist so ähnlich wie der, den Sie haben. Weiter in dem Artikel:
Wir können die Funktion öffnen und sie auf Probleme untersuchen. Es gibt ein $ http.get, das eine Schließung hat, die $ scope verwendet, aber alarmierend ist ein $ Intervall registriert, das alle 10 Sekunden ausgeführt wird und niemals abgemeldet wird. Der Intervall-Callback verwendet ein anderes $ http.get mit einer Closure, die $ scope verwendet. Das ist das Problem.
Wenn keiner der oben genannten Punkte zutrifft, dann ist hier die Liste der offenen Probleme in AngularJS
mit memory leak
als Schlüsselwort:
Ich bin mir nicht sicher, ob dir das helfen wird (vielleicht hast du schon nachgeschaut), aber es ist erwähnenswert. Ich hatte ein ähnliches Problem mit einer früheren Anwendung, bei der Objekte während jeder Ajax-Anfrage kontinuierlich dupliziert wurden. Also von der Last der Seite würde ich ungefähr 50 MB Speicher verwenden, aber nachdem ich 10-15 Ajax-Aufrufe gemacht habe, würde der Himmel auf & gt; 1 GB raketen.
Ich konnte das Problem mit den Chrome-Entwicklungstools erkennen und beheben - & gt; Speicher Registerkarte. Hier können Sie Zuordnungsprofile des Speichers aufzeichnen und einen Heap-Snapshot erstellen. Also, für Ihre Situation könnte ich den Timer zu Testzwecken auf 5 oder 10 Sekunden reduzieren und dann diese Profiler ausführen. Sie werden sehen können, welche Methoden aufgerufen werden und zu welchen Kosten.
Hoffe, das hilft.
Tags und Links javascript angularjs memory-leaks