Come forzare l'esecuzione del Garbage Collector?


147

L'intervistatore mi ha chiesto di questo oggi ... c'è una risposta?


3
Questa domanda ha buone informazioni sul perché non dovresti farlo però: stackoverflow.com/questions/118633/…
Hans Olsson,

1
perché lo dici così
Andrew Collins,

1
@Jason - Forse l'intervistatore non ha voluto ascoltare la soluzione, piuttosto ottenere la conoscenza e il ragionamento di Andrew per non farlo, quindi questa domanda potrebbe effettivamente avere un senso.
martinstoeckli,

2
@martinstoeckli È ancora una domanda terribile. Qualcuno con le conoscenze in un'intervista stressante non si accorgerebbe che si tratta di una domanda trabocchetto, o penserebbe di fornire informazioni aggiuntive. Quindi la domanda non aiuta l'intervistatore a distinguere tra qualcuno con la conoscenza o qualcuno senza di essa. Quindi la domanda è ancora terribile.
James,

2
"Quando forzate la raccolta dei rifiuti?" mi sembra una buona domanda per l'intervista ("How": non così tanto). Principiante: non lo so. Intermedio: mai. Esperto: quando si scrive un test per perdite di memoria.
mikebridge,

Risposte:


188

System.GC.Collect()forza l'esecuzione del Garbage Collector. Questo non è raccomandato ma può essere utilizzato in caso di situazioni.


17
Perché non è raccomandato?
Luke T O'Brien,

5
GC.Collect () è costoso da eseguire. Non è consigliabile farlo più del necessario. Il codice per quando dovrebbe essere chiamato è ben scritto. Normalmente dovresti auto-collezionarti solo in casi limite specializzati. stackoverflow.com/a/21961777/2710988
Brandon Barkley

186

Non è consigliabile chiamare gc esplicitamente, ma se si chiama

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

Chiamerà GC esplicitamente in tutto il codice, non dimenticare di chiamare GC.WaitForPendingFinalizers();dopo GC.Collect().


14
WaitForPendingFinalizersnon fornisce necessariamente "prestazioni migliori": si blocca semplicemente fino a quando tutti gli oggetti nella coda di finalizzazione non sono stati finalizzati (oggetti che potrebbero essere stati inseriti nella precedente chiamata a Collect). Se si desidera che tali oggetti vengano raccolti, è necessario un'altra chiamata Collect dopo la chiamata WaitForPendingFinalizers.
Luca

2
Dal momento che uno dei pochi buoni motivi per chiamare gc.Collect è come uno sforzo disperato per liberare risorse che non erano correttamente disposte, WaitForPendingFinalizers sembrerebbe un passo necessario. Non sono sicuro di quale sia la migliore pratica per evitare di chiamare gc.Colletta eccessivamente in questi casi, però. A proposito, mi chiedo se c'è qualche motivo tecnico che gc.Collect 'ha' per promuovere generazioni? Sembrerebbe più utile che le generazioni rimangano messe a meno che non sia stato allocato abbastanza materiale per giustificare l'avanzamento.
supercat

2
Nota per i principianti in C # (come me): GC force call non garantisce, alcuni oggetti inutilizzati concreti vengono rimossi dalla memoria. (un modo per farlo è usare "using statement" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567

Perché dovrebbe essere importante chiamare WaitForPendingFinalizers?
Christian,

19
GC.Collect() 

da MDSN ,

Utilizzare questo metodo per provare a recuperare tutta la memoria inaccessibile.

Tutti gli oggetti, indipendentemente da quanto tempo sono in memoria, vengono considerati per la raccolta; tuttavia, gli oggetti a cui viene fatto riferimento nel codice gestito non vengono raccolti. Utilizzare questo metodo per forzare il sistema a provare a recuperare la massima quantità di memoria disponibile.



12

GC.Collect();

Tieni presente, tuttavia, che il Garbage Collector potrebbe non sempre ripulire ciò che ti aspetti ...


5
Cosa vuoi dire con questo? Cosa potrebbe inaspettatamente pulire?
Voldemort,

5
@Voldemort - Non pulirebbe inaspettatamente nulla. Ma potrebbe non ripulire tutto ciò che ti aspetti.
Justin Niessner,

6

Non si desidera forzare l'esecuzione del Garbage Collector.

Tuttavia, se lo hai mai fatto (come un esercizio puramente accademico, ovviamente):

GC.Collect()

4
Preferisco la risposta di @ Karthik, ci possono essere situazioni in cui un'app dovrebbe legittimamente chiamare GC.Collect (). Molto raramente però.
Henk Holterman,

2
Supponi di avere una serie di riferimenti deboli e di voler verificare l'esistenza di riferimenti "attivi". Avrebbe senso chiamare GC.Collect () prima di controllare. Sto solo dicendo.
Rich Ehmer,

1
Sottovalutato perché l'istruzione di apertura non è corretta; Sì, voglio forzare l'esecuzione del Garbage Collector.
Syndog,

5

Penso che .Net Framework lo faccia automaticamente, ma per ogni evenienza. Innanzitutto, assicurati di selezionare ciò che desideri cancellare, quindi chiama il garbage collector:

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();

Penso che sia tutto .. Spero di aiutare qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.