Como forçar o coletor de lixo a ser executado?


147

O entrevistador me perguntou sobre isso hoje ... há uma resposta?


3
Esta pergunta tem boas informações sobre por que você não deve fazer isso: stackoverflow.com/questions/118633/…
Hans Olsson

1
por que você está dizendo isso
Andrew Collins

1
@ Jason - Talvez o entrevistador não quisesse ouvir a solução, em vez de obter o conhecimento e o raciocínio de Andrew para não fazê-lo, então essa pergunta poderia efetivamente fazer sentido.
martinstoeckli

2
@martinstoeckli Ainda é uma pergunta terrível. Alguém com o conhecimento de uma entrevista estressante não perceberia que é uma pergunta complicada ou pensaria em fornecer informações adicionais. Então a pergunta não ajuda o entrevistador a distinguir entre alguém com conhecimento ou alguém sem ele. Então a pergunta ainda é terrível.
James

2
"Quando você força a coleta de lixo?" me parece uma boa pergunta para uma entrevista ("Como": não muito). Iniciante: Não sei. Intermediário: nunca. Especialista: Quando você escreve um teste de vazamento de memória.
precisa saber é o seguinte

Respostas:


188

System.GC.Collect()força o coletor de lixo a ser executado. Isso não é recomendado, mas pode ser usado se houver situações.


17
Por que não é recomendado?
Luke T O'Brien

5
GC.Collect () é caro de executar. Fazer isso mais do que o necessário é desaconselhável. O código para quando deve ser chamado está bem escrito. Normalmente, você só deve coletar automaticamente em casos de borda especializados. stackoverflow.com/a/21961777/2710988
Brandon Barkley

186

Não é recomendável chamar explicitamente o gc, mas se você chamar

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

Ele chamará o GC explicitamente em todo o seu código, não se esqueça de ligar GC.WaitForPendingFinalizers();depois GC.Collect().


14
WaitForPendingFinalizersnão necessariamente fornece "melhor desempenho": ele simplesmente bloqueia até que todos os objetos na fila de finalização tenham sido finalizados (objetos que podem ter sido colocados lá pela sua chamada anterior Collect). Se você quiser uma chance desses objetos serem coletados, precisará de outra chamada Collect após a chamada WaitForPendingFinalizers.
23410 LukeH

2
Como uma das poucas boas razões para chamar o gc.Collect é o último esforço para liberar recursos que não foram descartados adequadamente, o WaitForPendingFinalizers parece uma etapa necessária. Porém, não tenho certeza de qual seria a melhor prática para evitar chamar gc.Collect nesses casos. BTW, eu me pergunto se existe alguma razão técnica que o gc.Collect 'tenha' para promover gerações? Parece mais útil que as gerações permaneçam paradas, a menos que tenham sido alocadas coisas suficientes em uma para justificar o avanço.
Supercat

2
Nota para iniciantes em C # (como eu): a chamada forçada do GC não garante, algum objeto concreto não utilizado é removido da memória. (uma maneira de fazer isso é usando a instrução "using" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567

Por que deveria ser importante ligar WaitForPendingFinalizers?
Christian

19
GC.Collect() 

do MDSN ,

Use este método para tentar recuperar toda a memória inacessível.

Todos os objetos, independentemente de quanto tempo estão na memória, são considerados para coleta; no entanto, objetos referenciados no código gerenciado não são coletados. Use este método para forçar o sistema a tentar recuperar a quantidade máxima de memória disponível.



12

GC.Collect();

Lembre-se, no entanto, de que o Garbage Collector nem sempre pode limpar o que você espera ...


5
O que você quer dizer com isso? O que poderia limpar inesperadamente?
Voldemort

5
@Oldemort - não limparia nada inesperadamente. Mas pode não limpar tudo o que você espera.
23615 Justin Niessner

6

Você não deseja forçar o coletor de lixo a executar.

No entanto, se você já fez (como um exercício puramente acadêmico, é claro):

GC.Collect()

4
Prefiro a resposta de @ Karthik, pode haver situações em que um aplicativo deve chamar legitimamente GC.Collect (). Muito raramente embora.
Henk Holterman

2
Digamos que você tenha uma série de referências fracas e queira verificar se existem referências "ativas". Faria sentido chamar GC.Collect () antes de verificar. Apenas dizendo.
Rich Ehmer

1
Voto negativo porque a declaração de abertura é factualmente incorreta; Sim, quero forçar o coletor de lixo a executar.
Syndog 5/09/19

5

Eu acho que o .Net Framework faz isso automaticamente, mas apenas por precaução. Primeiro, certifique-se de selecionar o que deseja apagar e, em seguida, chame o coletor de lixo:

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

Eu acho que é isso .. Espero ajudar alguém.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.