Wie kann man den Garbage Collector zum Ausführen zwingen?

147

Der Interviewer hat mich heute danach gefragt ... gibt es eine Antwort?

Andrew Collins
quelle
3
Diese Frage hat gute Informationen darüber, warum Sie das nicht tun sollten: stackoverflow.com/questions/118633/…
Hans Olsson
1
Warum erzählst du so
Andrew Collins
1
@Jason - Vielleicht wollte der Interviewer die Lösung nicht hören, sondern Andrews Wissen und Argumentation dagegen einholen, dann könnte diese Frage effektiv Sinn machen.
Martinstoeckli
2
@martinstoeckli Es ist immer noch eine schreckliche Frage. Jemand mit dem Wissen in einem stressigen Interview würde nicht erkennen, dass es sich um eine Trickfrage handelt, oder darüber nachdenken, zusätzliche Informationen zu liefern. Dann hilft die Frage dem Interviewer nicht, zwischen jemandem mit dem Wissen oder jemandem ohne das Wissen zu unterscheiden. Die Frage ist also immer noch schrecklich.
James
2
"Wann erzwingen Sie die Müllabfuhr?" klingt für mich nach einer guten Interviewfrage ("Wie": nicht so sehr). Anfänger: Ich weiß nicht. Mittelstufe: Niemals. Experte: Wenn Sie einen Test auf Speicherlecks schreiben.
Mikebridge

Antworten:

188

System.GC.Collect()zwingt den Müllsammler zum Laufen. Dies wird nicht empfohlen, kann aber in Situationen verwendet werden.

Karthik Ratnam
quelle
17
Warum wird es nicht empfohlen?
Luke T O'Brien
5
Die Ausführung von GC.Collect () ist teuer. Es ist nicht ratsam, mehr als nötig zu tun. Der Code, wann er aufgerufen werden soll, ist gut geschrieben. Normalerweise sollten Sie sich nur in speziellen Randfällen selbst sammeln. stackoverflow.com/a/21961777/2710988
Brandon Barkley
186

Es wird nicht empfohlen, gc explizit aufzurufen, aber wenn Sie anrufen

GC.Collect();
GC.WaitForPendingFinalizers();

Es ruft GC explizit im gesamten Code, vergessen Sie nicht, rufen Sie GC.WaitForPendingFinalizers();nach GC.Collect().

TalentTuner
quelle
14
WaitForPendingFinalizersDies führt nicht unbedingt zu einer "besseren Leistung": Es wird einfach blockiert, bis alle Objekte in der Finalisierungswarteschlange finalisiert wurden (Objekte, die möglicherweise durch Ihren vorherigen Aufruf an dort platziert wurden Collect). Wenn Sie eine Chance für diejenigen , wollen Objekte gesammelt werden , dann müssen Sie einen weiteren Anruf Collect nach Aufruf WaitForPendingFinalizers.
LukeH
2
Da einer der wenigen guten Gründe für den Aufruf von gc.Collect der letzte Versuch ist, Ressourcen freizugeben, die nicht ordnungsgemäß entsorgt wurden, scheinen WaitForPendingFinalizers ein notwendiger Schritt zu sein. Ich bin mir nicht sicher, was die beste Vorgehensweise wäre, um zu vermeiden, dass gc.Collect in solchen Fällen übermäßig aufgerufen wird. Übrigens, ich frage mich, ob es einen technischen Grund gibt, warum gc.Collect Generationen fördern muss. Es erscheint sinnvoller, Generationen bleiben zu lassen, wenn nicht genügend Material in einem zugewiesen wurde, um die Weiterentwicklung zu rechtfertigen.
Supercat
2
Hinweis für Anfänger in C # (wie ich): GC Force Call garantiert nicht, dass einige konkrete nicht verwendete Objekte aus dem Speicher entfernt werden. (Eine Möglichkeit, dies zu tun, ist die Verwendung von "using-Anweisung" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567
Warum soll es wichtig sein anzurufen WaitForPendingFinalizers?
Christian
19
GC.Collect() 

von MDSN ,

Verwenden Sie diese Methode, um zu versuchen, den gesamten Speicher zurückzugewinnen, auf den nicht zugegriffen werden kann.

Alle Objekte, unabhängig davon, wie lange sie sich im Speicher befinden, werden für die Sammlung berücksichtigt. Objekte, auf die im verwalteten Code verwiesen wird, werden jedoch nicht erfasst. Verwenden Sie diese Methode, um das System zu zwingen, die maximale Menge an verfügbarem Speicher zurückzugewinnen.

Srinivas Reddy Thatiparthy
quelle
12

GC.Collect();

Beachten Sie jedoch, dass der Garbage Collector möglicherweise nicht immer das aufräumt, was Sie erwarten ...

Justin Niessner
quelle
5
Was meinst du damit? Was könnte es unerwartet reinigen?
Voldemort
5
@Voldemort - Es würde nichts unerwartet reinigen. Möglicherweise wird jedoch nicht alles aufgeräumt, was Sie erwarten.
Justin Niessner
6

Sie möchten den Garbage Collector nicht zum Ausführen zwingen.

Falls Sie dies jemals getan haben (natürlich als rein akademische Übung):

GC.Collect()
thecoop
quelle
4
Ich bevorzuge die Antwort von @ Karthik. Es kann Situationen geben, in denen eine App GC.Collect () legitimerweise aufrufen sollte. Sehr selten.
Henk Holterman
2
Angenommen, Sie hatten eine Reihe schwacher Referenzen und wollten überprüfen, ob Live-Referenzen vorhanden sind. Es wäre sinnvoll, GC.Collect () vor der Überprüfung aufzurufen. Nur sagen.
Rich Ehmer
1
Abgestimmt, weil die Eröffnungserklärung sachlich falsch ist; Ja, ich möchte den Garbage Collector zum Ausführen zwingen.
Syndog
4

Ich denke, dass .Net Framework dies automatisch tut, aber nur für den Fall. Stellen Sie zunächst sicher, dass Sie auswählen, was Sie löschen möchten, und rufen Sie dann den Garbage Collector auf:

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

Ich denke das ist es .. Hoffe ich helfe jemandem.

Yagohaw
quelle