Speicherleck nicht verwendeter Variablen schließen

Ich möchte verstehen, unter welchen Umständen Variablen, die nicht weiter verwendet werden, in Closures gespeichert werden und zu Speicherlecks führen. Mein bevorzugtes Ergebnis wäre "es gibt keine", aber dies scheint nicht der Fall zu sein.

Von dem, was ich verstehe, wird eine Funktion, sobald sie in einer anderen Funktion deklariert ist, ihrem internen [[scope]] die Lexikalische Umgebung ihrer Kapselungsfunktion zugewiesen. Diese LexicalEnvironment verfügt zu diesem Zeitpunkt über lokale Referenzvariablen und die gesamte Scope-Kette. Dies beinhaltet grundsätzlichall freie Variablen, auf die die Funktion zugreifen konnte (von dem, was ich von @ verstanden halostechies, Javascript Verschlüsse erklärt).

Hier taucht das erste Problem auf: das sollte bedeutenall Diese Variablen können erreicht werden, solange die Funktion aktiv ist. Z.B. Folgendes sollte bereits auslaufen:

function a() {
    let big = new Array(1000000).join('*'); //never accessed
    //function unused() { big; }
    return () => void 0;
}
 
let fstore = [];
function doesThisLeak() {
  for(let i = 0; i < 100; i++) fstore.push(a());
}

doesThisLeak();

Dies scheint zum Glück bei meinem Firefox nicht der Fall zu sein. Ich habe mehrere Erklärungen erhalten, warum dies nicht leckt, von "der Jitter ist klug" bis "LexicalEnvironment ist ein Datensatztyp, der bedeutet, dass GC die nicht verwendeten Variablen sammeln kann". Ich weiß immer noch nicht, ob beides richtig ist, ob dies nicht für alle modernen Laufzeiten gilt und warum.

ach weiteren Recherchen fand ich auth0, vier Arten von Lecks in Javascript (leider scheint es keine HTML-ID zu geben, zu der man springen kann, der relevante Teil ist "4: Closures"), der einen Weg zeigt, die nicht verwendeten Variablen auszulöschen, egal, was intelligent ist. Im obigen Snippet, wenn ich nur die "unbenutzte" Funktion auskommentiere, sehe ich, dass die RAM-Auslastung nie wieder abnimmt (es wurde bereits bemerkt, dass es sein könnte, dass GC einfach aus anderen Gründen nicht ausgeführt wurde. Bisher gehe ich jedoch davon aus Ich habe auch erfahren, dass dies auf Firefox beschränkt war, aber es schien ein ähnliches Verhalten in Chrom hervorzurufe

Dieses Beispiel (falls es wirklich das tut, was ich glaube) zeigt, dass völlig unbenutzte Variablen aufgrund einer Funktionsdeklaration im selben Bereich auslaufen können.

Um meine Probleme abzuschließen:

Was ist der Grund dafür, dass im obigen Snippet "groß" gesammelt wird (wenn "unbenutzt" kommentiert wird) und passiert dies bei allen modernen Laufzeiten?Angenommen, im Beispiel mit der Funktion "unbenutzt" wurden keine Leckagen kommentiert. Was sind die besten Methoden, um solche versehentlichen Leckagen zu vermeiden? Gibt es noch mehr Ich habe bereits den Vorschlag bekommen, alle lokalen Variablen, die am Ende von Funktionen nicht mehr verwendet werden, auf Null zu setzen, was jedoch absurd hässlich erscheint. Ich befürchte, temporäre Variablen für Vorberechnungen und versehentliche Lecks zu verwenden.

PS: Es ist ziemlich schwierig sicherzustellen, dass diese Frage nicht bereits im Dschungel der Fragen nach Speicherlecks mit Verschlüssen gestellt wurde.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage