Kann diese Funktion Müll-gesammelt werden?

9

Betrachten Sie dieses Stück Kuchen ... ähm, Code:

%Vor%

Sobald die Funktion im Promise-Konstruktor beendet ist ...

  1. Ist das Promise -Objekt "Müll sammeln"?
  2. Ist 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.

    
Robert Rossmann 30.03.2015, 08:38
quelle

3 Antworten

1

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.

    
Esailija 31.03.2015, 05:34
quelle
0
  1. Das Objekt 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
  2. Sie haben Recht, doMoreWork ist auch nicht sammelbar, weil das Promise -Objekt einen Verweis darauf hat

Die Anweisung doWork().then(...) kann durch

ersetzt werden %Vor%

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

    
Karroffel 30.03.2015 09:38
quelle
0

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.

    
user3832931 14.09.2017 10:55
quelle