Ich habe bemerkt, dass RSS (Resident Set Size) meiner node.js App im Laufe der Zeit wächst, und in Anbetracht der Tatsache, dass ich einen Fehler "JS Object Allocation Failed - Nicht genügend Speicher" auf meinem Server habe, scheint es wahrscheinliche Ursache.
Ich habe die folgende sehr einfache Knoten App eingerichtet:
%Vor%Halten Sie einfach den Hotkey "Aktualisieren" @ http: // localhost: 8888 / Ich kann den RSS / heap / etc. wachsen, bis RSS weit über 50mb (bevor mir langweilig wird). Warte ein paar Minuten und komm zurück, der RSS fällt - vermutlich ist der GC gelaufen.
Ich versuche herauszufinden, ob das erklärt, warum meine eigentliche Knoten-App abstürzt ... meine Produktions-App erreicht schnell eine RSS-Größe von etwa 100 MB, wenn sie abstürzt, liegt sie im Allgemeinen zwischen 200 MB-300 MB. Soweit ich das beurteilen kann, sollte dies nicht zu groß sein (der Knoten sollte mit 1,7 Gb oder so umgehen können, glaube ich), aber ich bin besorgt darüber, dass die RSS-Größe auf meinem Produktionsserver nach oben tendiert (Falloffs) repräsentieren Abstürze):
Diese Frage ist schon ziemlich alt und hat noch keine Antwort, also werde ich meine einwerfen, die auf Blogbeitrag von 2013-2014 von Jay Conrod, der "an der Optimierung der V8-JavaScript-Engine für Mobiltelefone gearbeitet hat" .
V8 versucht, beim Sammeln von Müll effizient zu sein, und dafür verwendet er Inkrementelle Markierung und lazy fegen .
Grundsätzlich ist die inkrementelle Markierung für die Verfolgung verantwortlich, ob Ihre Objekte gesammelt werden können.
Die inkrementelle Markierung beginnt, wenn der Heap eine bestimmte Schwellenwertgröße erreicht.
Lazy-Sweeping ist verantwortlich für das Sammeln der Objekte, die während der inkrementellen Markierung als "Garbage" gekennzeichnet sind und andere zeitaufwendige Aufgaben ausführen.
Sobald die inkrementelle Markierung abgeschlossen ist, beginnt das verzögerte Fegen. Alle Objekte wurden als "live" oder "dead" markiert, und der Heap weiß genau, wie viel Arbeitsspeicher durch Sweeping freigegeben werden kann. All diese Speicher müssen nicht unbedingt sofort freigegeben werden, und die Verzögerung des Sweeps wird nichts wirklich schaden. Anstatt also alle Seiten gleichzeitig zu durchsuchen, fegt der Garbage Collector Seiten nach Bedarf, bis alle Seiten gekehrt sind. Zu diesem Zeitpunkt ist der Speicherbereinigungszyklus abgeschlossen und die inkrementelle Markierung kann erneut gestartet werden.
Ich denke, das erklärt, warum Ihr Server so viel Speicher zuweist, bis er eine bestimmte Obergrenze erreicht. Zum besseren Verständnis empfehle ich Jay Conrods Blogpost "Eine Tour von V8: Garbage Collection" zu lesen. .