2010-06-19 15 views
5

¿Es posible que un programador inicie/detenga programáticamente la recolección de basura en el lenguaje de programación C#? Por ejemplo, para optimizar el rendimiento, etc.¿Es posible detener la recolección de basura .NET?

+1

La recolección de elementos no utilizados no forma parte del lenguaje de programación C#. Es parte de .NET CLR. –

+0

"Un poco". Si nunca asigna nada, el GC nunca se acumulará. Asigne previamente todo lo que necesita y luego llame a 'GC.Collect()'. –

+0

Quizás también eche un vistazo a esta respuesta: http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time/6005949#6005949 – Gamlor

Respuesta

6

Realmente no. Puede dar las sugerencias GC a través de métodos como GC.AddMemoryPressure o GC.RemoveMemoryPressure, pero no detenerlo directamente.

Además, la recolección de basura no es tan intensa en un proceso. Los programadores rara vez se preocupan por eso.

+0

Oh, ya veo ... ¿Qué tal el método SuppressFinalize()? ¿Tiene un propósito diferente? – Alex

+0

SuprimirFinalizar funciona en objetos individuales. Definitivamente no en todo el GC. Desde MSDN: los objetos que implementan la interfaz IDisposable pueden llamar a este método desde el método IDisposable.Dispose para evitar que el recolector de basura invoque Object.Finalize en un objeto que no lo requiera. (Así que, básicamente, es una mejora de rendimiento muy leve.) –

+0

No veo cómo esto sería agregar una sugerencia para * prevenir * recolección de basura, per-se; si llama a 'GC.AddMemoryPressure', es más que probable que el CLR genere * más * recolecciones de basura, ya que indica que la memoria disponible para el CLR para el proceso (virtual o de otro tipo) es menor de lo que cree. Uno * podría * llamar a 'GC.RemoveMemoryPressure' sin una llamada correspondiente a' GC.AddMemoryPressure', en un intento de engañar al CLR para que piense que tiene más memoria que la que tiene, pero uno pensaría que el API es resistente (uno lo haría esperanza) a tales cosas. – casperOne

3

No, no lo hay. En el mejor de los casos, puede desencadenar la recolección de basura usted mismo, aunque esto se considera una cosa muy mala ya que puede interferir con los algoritmos de programación incorporados utilizados por el GC.

+0

No se puede activar la recolección , solo puedo "sugerir" a. GC decidirá por sí mismo –

4

En general, no. Y la mayoría de la gente consideraría una optimización prematura preocuparse por la recolección de basura a menos que haga algún perfil y descubra que realmente es la causa del bajo rendimiento en su aplicación.

Si le interesan los detalles de ajustar el GC para el rendimiento (o más bien, ajustar su aplicación para mejorar su rendimiento en relación con el GC), MSDN tiene una descripción bastante decente de cómo hacerlo.

4

Mientras tanto es posible, hay métodos en el GCclass:

GC.TryStartNoGCRegion(...) y GC.EndNoGCRegion().

Cuestiones relacionadas