Erzwingen der Speicherbereinigung in Google Chrome
Entwickeln wir eine single-page-web-app mit ZKdie ständig kommuniziert mit dem server und aktualisiert Teile der Bildschirme. Die Aktualisierung kann als Häufig als 1s. Während diese updates, Verweise auf große Mengen von JS Objekte sind verloren, und die Objekte werden gereinigt, indem der garbage collector irgendwann.
Soweit wir herausgefunden haben, Chrome läuft nur seine garbage collector auf inaktiven tabs. Dies ist ein problem für uns, weil das app-tab ist in der Regel aktiv und fast nie aktualisiert, so JS Objekte nie gesammelt. Wenn die linke aktiv genug Zeit, die Reiter stürzt schließlich ab (Aww Snap Nachricht).
Müssen wir initiieren die garbage collection manuell. Wir haben bisher versucht, läuft Chrome mit --js-flags="--expose-gc"
und läuft gc()
aber es gibt eine Ausnahme:
ReferenceError: gc is not defined
Dies nicht passiert, Firefox-Speicherauslastung ist mehr oder weniger eine Konstante.
Force Aktualisierung der Seite ist keine option.
Wären wir dankbar für alle Vorschläge.
BEARBEITEN: wir haben versucht, läuft window.gc()
und gc()
sowohl auf Chrome-Versionen 23.0.1271.97 m
und 25.0.1364.2 dev-m
InformationsquelleAutor der Frage Paulius K. | 2012-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie fetch-code des Chrome-Dev-Tools, ändern Sie es so, dass
ProfilerAgent.collectGarbage();
aufgerufen wird jedes jetzt und dann (es ist ein code, der aufgerufen wird, wenn Sie klicken Sie auf "Sammeln Müll" - Taste auf der Timeline-panel), und führen Sie Chrome-mit Ihrer version der DevTools mit--debug-devtools-frontend
Flagge.Diese Lösung allerdings ganz extrem der Fall ist, versuchen Sie es nur, wenn man wirklich verzweifelt. Bis dahin, schlage ich vor, profiling Ihrer Anwendung und überprüfen Sie heraus, warum der v8 entscheidet, Sie nicht zu reinigen, den Müll (oder nicht sauber den Müll). Schnittfenster DevTools wird Ihnen helfen, mit diesem. Beginnen Sie mit der überprüfung, ob "Sammeln Müll" - button am Ende dieser Seite wirklich macht seinen job, wenn nicht - Sie haben wahrscheinlich einen Speicherverlust (zumindest nach v8). Wenn ja, versuchen Sie Leck-Sucher-für-javascript.
[BEARBEITEN] habe ich entfernt, info über Google chrome-Erweiterung, wie es sich herausstellt, dass
gc()
aufgerufen werden kann, Webseiten code, wenn--js-flags="--expose-gc"
verwendet wird. Zumindest auf meinem 23.0.1271.64.InformationsquelleAutor der Antwort Konrad Dzwinel
In Chrome Developer Tools, die Sie haben, die "Timeline" Abschnitt von rund Chrom 53. Sie haben dort die Schaltfläche sieht aus wie Müll. Klick auf es, und es zwingt den garbage collector zu laufen.
InformationsquelleAutor der Antwort Nisim Joseph
Habe eine Lösung gefunden. Anscheinend Chrome-Lecks DOM-Knoten, zumindest in der aktuellen version (26.0.1410.65 jetzt)
Ich nahm dev tools-timeline in meine app und es zeigte sich das Ereignis-Listenern zählen nach oben und unten rhythmisch zusammen mit meiner app-Bildschirm die Inhalte, aber die DOM-Knoten zählen, war stetig im Laufe der Zeit, bis der Reiter stürzte.
Habe ich versucht die Letzte Version von Chrome Canary (28.0.1500.3) und Sie scheinen das problem behoben. DOM-Knoten zählen, Graphen folgt nun die gleichen rhythmischen Muster als Ereignis-Listener.
Die Sache, die mich erhält, ist...warum nicht gmail immer Absturz? Ich in der Regel halten eine Registerkarte zu öffnen, die für Wochen zu einer Zeit...
InformationsquelleAutor der Antwort Partap Davis