¿Cómo forzar al recolector de basura a correr?


147

El entrevistador me preguntó sobre esto hoy ... ¿hay una respuesta?


3
Sin embargo, esta pregunta tiene buena información sobre por qué no deberías hacer eso: stackoverflow.com/questions/118633/…
Hans Olsson

1
¿Por qué estás diciendo así
Andrew Collins

1
@Jason: tal vez el entrevistador no quería escuchar la solución, sino obtener el conocimiento y el razonamiento de Andrew en contra de hacerlo, entonces esta pregunta podría tener sentido.
martinstoeckli

2
@martinstoeckli Sigue siendo una pregunta terrible. Alguien con el conocimiento en una entrevista estresante no se daría cuenta de que es una pregunta capciosa, o pensaría en proporcionar información adicional. Entonces la pregunta no ayuda al entrevistador a distinguir entre alguien con el conocimiento o alguien sin él. Entonces la pregunta sigue siendo terrible.
James

2
"¿Cuándo fuerza la recolección de basura?" me parece una buena pregunta de entrevista ("Cómo": no tanto). Principiante: No lo sé. Intermedio: nunca. Experto: cuando escribe una prueba para detectar pérdidas de memoria.
mikebridge

Respuestas:


188

System.GC.Collect()obliga al recolector de basura a funcionar. Esto no se recomienda, pero se puede usar si surgen situaciones.


17
¿Por qué no se recomienda?
Luke T O'Brien

55
GC.Collect () es costoso de ejecutar. Hacerlo más de lo necesario es desaconsejable. El código para cuándo debería llamarse está bien escrito. Normalmente, solo debe autocobrarse en casos especiales especializados. stackoverflow.com/a/21961777/2710988
Brandon Barkley

186

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

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

Llamará a GC explícitamente a través de su código, no olvide llamar GC.WaitForPendingFinalizers();después GC.Collect().


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

2
Dado que una de las pocas buenas razones para llamar a gc.Collect es como un último esfuerzo para liberar recursos que no se eliminaron correctamente, WaitForPendingFinalizers parece un paso necesario. Sin embargo, no estoy seguro de cuál sería la mejor práctica para evitar llamar a gc. Sin embargo, en estos casos, debe recolectar en exceso. Por cierto, me pregunto si hay alguna razón técnica que gc.Collect 'tenga' para promover generaciones. Parecería más útil que las generaciones se queden a menos que se hayan asignado suficientes cosas en una para justificar el avance.
supercat

2
Nota para principiantes en C # (como yo): la llamada forzada de GC no garantiza que algún objeto concreto no utilizado se elimine de la memoria. (una forma de hacerlo es mediante el uso de "declaración de uso" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
usuario1234567

¿Por qué se supone que es importante llamar WaitForPendingFinalizers?
Christian

19
GC.Collect() 

de MDSN ,

Use este método para intentar recuperar toda la memoria inaccesible.

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



12

GC.Collect();

Sin embargo, tenga en cuenta que el recolector de basura no siempre puede limpiar lo que espera ...


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

55
@Voldemort - No limpiaría nada inesperadamente. Pero puede que no limpie todo lo que espera.
Justin Niessner

6

No desea forzar la ejecución del recolector de basura.

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

GC.Collect()

44
Prefiero la respuesta de @ Karthik, puede haber situaciones en las que una aplicación debería llamar legítimamente a GC.Collect (). Muy raramente sin embargo.
Henk Holterman el

2
Digamos que tenía una serie de referencias débiles y quería verificar si existían referencias 'en vivo'. Tendría sentido llamar a GC.Collect () antes de verificar. Solo digo.
Rich Ehmer

1
Voto negativo porque la declaración de apertura es objetivamente incorrecta; Sí, quiero forzar al recolector de basura a que se ejecute.
Syndog el

5

Creo que .Net Framework hace esto automáticamente pero por si acaso. Primero, asegúrese de seleccionar lo que desea borrar y luego llame 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 ayudar a alguien.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.