Betrachten Sie dieses Stück Kuchen ... ähm, Code:
%Vor%Sobald die Funktion im Promise-Konstruktor beendet ist ...
Promise
-Objekt "Müll sammeln"? doMoreWork()
Müll sammeln? Meine Vermutung ist, dass doMoreWork()
nicht direkt GC-ed sein kann, weil die Promise einen Verweis darauf behält, aber sobald der Body der Versprechung fertig ist und den Ausführungskontext in den oberen (?) Bereich zurückbringt, wird der Stack abgewickelt Es gibt keine weiteren Anweisungen, die hier ausgeführt werden können) und das Versprechen wird unerreichbar und ist somit Müll sammelnd.
Können Sie bestätigen, dass mein Verständnis dieses Themas korrekt ist?
Wie kann ich dieses Verhalten empirisch beobachten? Mit anderen Worten: Wie kann ich überwachen, welche Objekte zu welchem Zeitpunkt erfasst werden? Ich entwickle rein in Node.js, wenn das irgendeinen Unterschied macht.
Es gibt nichts, was sich auf das Versprechen bezieht, also wird es Müll gesammelt. Das Versprechen ist die einzige Sache, die Bezug auf die Funktion doMoreWork
hält, also wird es auch Müll gesammelt.
Wie konnte ich dieses Verhalten empirisch beobachten? Mit anderen Worten: Wie kann ich überwachen, welche Objekte zu welchem Zeitpunkt erfasst werden? Ich entwickle rein in Node.js, wenn das irgendeinen Unterschied macht.
Der GC in V8 sammelt niemals unbedingt ein Objekt. Wenn dies zum Beispiel Ihr gesamtes Programm ist, wäre es Zeitverschwendung, überhaupt einen GC zu starten.
Promise
ist sammelbar, wenn keine Referenzen darauf verweisen.
Bei Verwendung von doWork().then(...)
wird eine temporäre Referenz erstellt. Bis also .then
nicht mehr blockiert, gibt es einen Verweis auf das Objekt, so dass es nicht gesammelt werden kann doMoreWork
ist auch nicht sammelbar, weil das Promise
-Objekt einen Verweis darauf hat Die Anweisung doWork().then(...)
kann durch
Sie können sich also vorstellen, dass Sie das Promise
-Objekt direkt verwenden, also das "Upper" -Scope, wo das Objekt verwendet wird.
Objekte werden normalerweise gesammelt, wenn keine Referenzen mehr darauf vorhanden sind. Auch wenn der Code in einer Promise ist, ist es nur ein Objekt und der Aufruf von then
ist verkettet, also wird das Objekt verwendet
Um zu sehen, ob ein Objekt ein Sammelobjekt ist, können Sie einen Test erstellen und nach einem Speicherleck suchen (über den Task-Manager). Wenn Ihr Code richtig geschrieben ist, wird alles gesammelt.
Tags und Links javascript garbage-collection node.js v8