2017-01-14 1 views
1

Ich portiere eine große angular.js/node App zu NW.js. Alles war gut, bis ich den Speicherverbrauch der App überprüft habe. Als die App gestartet wurde, verbrauchte der nwjs Helper Prozess 75 MB. Nach dem ersten Neuladen mit location.reload() oder win.reload() stieg die Speichernutzung auf 110 MB. Zweiter Nachladevorgang, 125 MB. Third Reload, 155 MB, Viertes Nachladen, 180 MB. Fünfter Nachladevorgang, 205 MB, Sechster Nachladevorgang 235 MB ... und so weiter. Bei 20 oder 25 Reloads ist die App abgestürzt. Die App verfügt über untergeordnete Knotenprozesse, die ihre Speicherauslastung beim erneuten Laden stabil bei 30 MB halten. Es gibt keinen gemeinsamen Kontext zwischen Knoten und Chrome. Die gesamte Kommunikation zwischen Knoten- und Chrome-Prozessen erfolgt über localStorage. Die gleiche eckige App, die in Chrome als Webanwendung ausgeführt wird, weist keine Speicherlecks auf und der Speicher beginnt bei jedem erneuten Laden bei Null.Flush alle Speicher beim Neuladen in NW.js

Ich fand eine teilweise Lösung mit chrome.runtime.reload(), aber das Problem ist, dass es nicht nur die Chromansicht, sondern alle untergeordneten Prozesse aktualisieren (ist wie beenden und starten Sie die App). Ich muss die Knotenprozesse beibehalten, die ausgeführt werden, wenn die Hauptansicht aktualisiert wird. Ich habe in Foren gelesen, dass viele Leute das gleiche Problem mit Speicherlecks haben, die beim Navigieren von einer Seite zu einer anderen Seite in der Chrome-Webansicht auftreten. Ich habe versucht, alle Speicher Knoten für Knoten vor dem Neuladen zu löschen und nichts passiert (mit einem Black Hole-Programm von Robert CMoses Kałamański). Ich habe versucht mit global.gc() mit "js-flags": "--expose-gc" und nichts ist passiert.

Ich machte eine andere einfache App mit nur ein paar Variablen, und das gleiche Speicherleck erschien beim Nachladen. Ich habe versucht, die NW.js Demo-App (wenn Sie nur nwjs ohne Parameter ausführen) und es erscheint ein grauer Bildschirm mit New, Chrome und Node-Versionen. Wenn Sie auf dieser einfachen Seite mit der rechten Maustaste auf App neu laden klicken, wird die Speichernutzung ebenfalls steigen ... OMG !!!!

Gibt es eine Möglichkeit, den gesamten Speicher der Chromansicht in NW.JS zu leeren, kurz bevor das Fenster beim Neuladen entladen wird? Gibt es eine sichere Möglichkeit, alle JavaScript-Objekt- und DOM-Knoten zu löschen? Oder ist dies ein Fehler der NW.js Speicherverwaltung?

Ich verwende NW.js v 0.19.4

Antwort

0

Bitte stellen Sie sicher, dass es auf das DOM keine Referenz in den Knoten Kontextobjekte ist. Der Node-Kontext befindet sich auf der Hintergrundseite und wird während der gesamten Lebensdauer der Anwendung ausgeführt. Verwenden Sie dazu den Heap-Profiler in den Devtools, um herauszufinden, auf welche Objekte verwiesen wird.

Eine andere Möglichkeit ist die Verwendung des Modus "gemischter Kontext", bei dem Knotenkontext und DOM-Kontext identisch sind.

Mehr hier: http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/

+0

ich alles versucht, die Sie erwähnt, ohne Ergebnisse. Wie ich gepostet habe, wenn Sie eine sehr einfache App erstellen, ohne auf den Knoten zuzugreifen und neu zu laden, wird Ihr Speicher nach jedem Neuladen erhöht. Versuchen Sie es mit der Zielseite von nwjs, Sie erhalten denselben Fehler. –

+0

Nur getestet in nw.js 0.19.5 mit und ohne SDK, das gleiche Problem ... –

+0

Roger, ich werde deine Unterstützung hier wirklich schätzen. Ich habe auch zwei hochrangige Mitglieder meines Teams, die dieses Thema ohne irgendwelche Nachrichten untersuchen, und wenn wir keine Lösung finden, werden wir zum Elektron wechseln müssen (nicht nach meinem Geschmack, aber ohne dieses Memory-Leak-Problem, soweit wir untersucht haben in Foren). Die App ist auf eckigen js 1.5 gebaut und ist riesig in Code (Restaurant App mit mehr als 300 Restaurants verwenden, überprüfen Sie Toteat). Die App hat Node-Prozesse, die HTTP-Anforderung auf Port 80 und Socket in Por 8080 hören. Die gesamte Kommunikation erfolgt über LocalStorage und die Daten werden in Websql gespeichert. –