2010-11-23 16 views
93

Interviewer fragte mich heute darüber ... gibt es eine Antwort?Wie erzwinge ich den Garbage Collector?

+3

Diese Frage hat gute Informationen darüber, warum Sie das nicht tun sollten: http://stackoverflow.com/questions/118633/ whats-so-falsch-about-using-gc-collect –

+1

warum erzählst du so –

+0

Der Wie Teil ist weit weniger wichtig als das Warum (nicht) es Frage zu nennen. –

Antwort

121

System.GC.Collect() Kräfte Garbage Collector zu laufen. Dies wird nicht empfohlen, kann aber verwendet werden, wenn Situationen auftreten.

+31

+1 für "wenn Situationen auftreten". –

+1

Warum wird es nicht empfohlen? –

10
+0

Beste Antwort aller Zeiten. Nur ein Semikolon fehlt ... :( –

12
GC.Collect() 

von MDSN,

Verwenden Sie diese Methode, um zu versuchen alle Speicher zurückzufordern, die nicht zugänglich ist.

Alle Objekte, unabhängig davon, wie lange sie im Speicher waren, werden für die Sammlung berücksichtigt; Objekte, die in verwaltetem -Code referenziert werden, werden jedoch nicht erfasst. Verwenden Sie diese Methode, um das System zu versuchen, die maximale Menge von verfügbaren Arbeitsspeicher zu erzwingen.

9

GC.Collect();

Beachten Sie aber, dass der Garbage Collector nicht immer aufzuräumen, was Sie erwarten ...

+4

Was meinst du damit? Was könnte es unerwartet sauber? – Voldemort

+3

@Voldemort - Es würde nicht unerwartet etwas reinigen. Aber es kann nicht alles aufräumen, was Sie erwarten. –

142

Es ist nicht explizit zu nennen gc empfohlen wird, aber wenn Sie

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

Es ruft GC explizit in Ihrem Code, vergessen Sie nicht, GC.WaitForPendingFinalizers(); nach GC.Collect() zu rufen.

+7

'WaitForPendingFinalizers' gibt nicht unbedingt" bessere Leistung ": Es blockiert einfach, bis alle Objekte in der Finalisierungswarteschlange abgeschlossen sind (Objekte, die möglicherweise durch Ihren vorherigen Aufruf von' Collect' dorthin gelegt wurden). Wenn Sie eine Chance für Diese Objekte gesammelt werden, dann brauchen Sie * einen anderen Aufruf an 'Collect' * nach dem Aufruf von' WaitForPendingFinalizers'. – LukeH

+1

Da einer der wenigen guten Gründe, gc.Collect aufzurufen, ist ein letzter Versuch, Ressourcen zu befreien, die waren Wenn Sie nicht richtig sortiert haben, scheint WaitForPendingFinalizers ein notwendiger Schritt zu sein. Ich bin mir nicht sicher, was die beste Vorgehensweise wäre, um gc.Collect in solchen Fällen übermäßig zu nennen. BTW, ich frage mich Gibt es irgendeinen technischen Grund, warum gc.Collect "Generationen" zu fördern hat? Es scheint sinnvoller zu sein, dass Generationen bleiben, wenn nicht genug Zeug in einem gegeben ist, um den Fortschritt zu rechtfertigen. – supercat

+2

_Hinweis für Anfänger in C# _ (wie ich): GC force call garantiert nicht, einige konkrete unbenutzte Objekte aus dem Speicher entfernt werden. (Eine Möglichkeit, dies zu tun, ist die Verwendung von "using-Anweisung" (https://msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx)) – user1234567

6

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

Wenn Sie jedoch jemals getan hat (als rein akademische Übung, natürlich):

GC.Collect() 
+1

Ich bevorzuge @ Karthiks Antwort, dort kann Situationen sein, in denen eine App GC.Collect() rechtmäßig aufrufen sollte. Sehr selten aber. –

+1

Angenommen, Sie hatten eine Reihe von schwachen Referenzen und wollten überprüfen, ob irgendwelche 'Live'-Referenzen vorhanden waren. Es wäre sinnvoll, vor der Überprüfung GC.Collect() aufzurufen. Sag es einfach. –

1

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

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, dass ich jemand helfen.

0
GC.Collect(); 

wir rufen Garbage Collector von sammeln Methode von Garbage Collector. Meistens gibt es keine Notwendigkeit, Garbage Collector aufzurufen, da es kontinuierlich im Hintergrundprozess durch separaten Thread läuft

Verwandte Themen