2010-11-23 13 views
93

El entrevistador me preguntó acerca de esto hoy ... ¿hay alguna respuesta?Cómo forzar al recolector de basura a ejecutarse?

+3

Esta pregunta tiene buena información sobre por qué no debes hacer eso: http://stackoverflow.com/questions/118633/ qué-tan-mal-acerca-de-usar-gc-collect –

+1

por qué está diciendo así –

+0

La parte de cómo es mucho menos importante que la pregunta de por qué (no) para llamarlo. –

Respuesta

121

System.GC.Collect() fuerzas recolector de basura para funcionar. Esto no es recomendable, pero se puede usar si surgen situaciones.

+31

+1 para "si surgen situaciones". –

+1

¿Por qué no se recomienda? –

10
+0

La mejor respuesta de la historia. Solo falta un punto y coma ... :( –

12
GC.Collect() 

de MDSN,

Utilice este método para tratar de recuperar todo memoria que es inaccesible.

Todos los objetos, independientemente de cuánto tiempo hayan estado en la memoria , son considerados para recolección; sin embargo, los objetos que se mencionan en el código administrado no se recopilan. Utilice este método para forzar al sistema a intentar recuperar la cantidad máxima de memoria disponible .

9

GC.Collect();

Tenga en cuenta, sin embargo, que el recolector de basura no siempre puede limpiar lo que esperas ...

+4

¿Qué quieres decir con eso? ¿Qué podría limpiar inesperadamente? – Voldemort

+3

@Voldemort - No limpiaría inesperadamente nada, pero puede no limpiar todo lo que esperas. –

142

No se recomienda llamar gc explícitamente, pero si se llama

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

se llamará GC de forma explícita en todo el código, no se olvide de llamar GC.WaitForPendingFinalizers(); después GC.Collect().

+7

'WaitForPendingFinalizers' no proporciona necesariamente un" mejor rendimiento ": simplemente bloquea hasta que se hayan finalizado todos los objetos en la cola de finalización (objetos que podrían haber sido colocados allí por su llamada anterior a' Collect'). Si desea una oportunidad para esos objetos que se deben recopilar, entonces necesita * otra * llamada a 'Recoger' * después de * llamar a' WaitForPendingFinalizers '. – LukeH

+1

Dado que una de las pocas buenas razones para llamar a gc.Collect es como un último esfuerzo para liberar recursos que no mal dispuesto, WaitForPendingFinalizers parece un paso necesario. Sin embargo, no estoy seguro de cuál sería la mejor práctica para evitar llamar a gc.Collect en exceso en tales casos. Por cierto, me pregunto si ¿Hay alguna razón técnica que gc.Collect 'tiene' para promover generaciones? Parecería más útil mantener a las generaciones a menos que se hayan asignado suficientes elementos para justificar su avance. – supercat

+2

_Nota para principiantes en C# _ (como yo): GC force call no garantiza, algún objeto concreto no utilizado se eliminará de la memoria. (Una forma de hacerlo es mediante el uso de "using statement" (https://msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx)) – user1234567

6

No desea obligar al recolector de elementos no utilizados a ejecutarse.

Sin embargo, si alguna vez lo hizo (como un ejercicio puramente académico, por supuesto):

GC.Collect() 
+1

Prefiero la respuesta de @Karthik, allí pueden ser situaciones en las que una aplicación debería llamar legítimamente GC.Collect(). Muy raramente sin embargo. –

+1

Digamos que tiene una serie de referencias débiles y quería comprobar si existía alguna referencia 'en vivo'. Tendría sentido llamar a GC.Collect() antes de verificar. Solo digo. –

1

Creo que .Net Framework hace esto de forma automática, pero por las dudas. En primer lugar, asegúrese de seleccionar lo que desea borrar, y luego llamar al recolector de basura:

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

Creo que eso es todo .. Espero que ayudar a alguien.

0
GC.Collect(); 

llamamos al recolector de basura por el método de recolección de recolector de basura. en su mayoría no hay necesidad de llamar al recolector de basura porque se ejecuta continuamente en proceso en segundo plano por un hilo separado

Cuestiones relacionadas