2009-12-05 31 views
5

He oído que C# no libera la memoria de inmediato, incluso si ha terminado con ella. ¿Puedo forzar C# para liberar memoria?¿Puedo forzar la limpieza de la memoria en C#?

Estoy usando Visual Studio 2008 Express. ¿Eso importa?

P.S. No estoy teniendo problemas con C# y cómo administra la memoria. Tengo curiosidad.

+20

detenerlo. No lo hagas Déjalo. No te atrevas No. No es tuyo. Vete, piensa en otra cosa. – Will

+3

@Will. Tocado en un punto dolorido ¿no? –

+0

@Jim A menos que sea un experto y sepa lo que está haciendo, no lo haría. Incluso como experto, no lo haría. Si encuentra que necesita llamar al GC, apuesto a que hay otro problema ... es decir, una * pérdida de memoria *. –

Respuesta

17

Jim,

Se oyó correctamente. Limpia memoria periódicamente a través de un mecanismo llamado Garbage Collector. Puede "forzar" la recolección de basura a través de una llamada como la siguiente.

GC.Collect(); 

Le recomiendo que lea this MSDN article on garbage collection.

EDITAR 1: "Force" fue entre comillas. Para ser más claro como lo fue otro cartel, esto realmente solo lo sugiere. Realmente no puedes hacer que suceda en un punto específico en el tiempo. De ahí el enlace al artículo sobre recolección de basura en .NET

EDIT 2: Me di cuenta de que todos aquí solo respondieron directamente a su pregunta principal. En cuanto a tu pregunta secundaria. El uso de Visual Studio 2008 Express seguirá utilizando el .NET Framework, que es el que realiza la recolección de elementos no utilizados. Entonces, si alguna vez actualiza a la edición profesional, aún tendrá las mismas capacidades/limitaciones de administración de memoria.

Editar 3: This wikipedia aritcles on finalizers da algunos buenos consejos de lo que es apropiado hacer en un finalizador. Básicamente, si está creando un objeto que tiene acceso a recursos críticos, o si está consumiendo dicho objeto, implemente IDispose y/o aproveche el usando la instrucción. El uso llamará automáticamente al método Dispose, incluso cuando se lanzan excepciones. Eso no quiere decir que usted no necesita dar a la carrera finalizadores pista ...

+0

Gracias. Mucha información allí. Buen artículo, esp. ya que vengo de un fondo de C++. – jim

+0

El enlace está roto. ¿Puedes actualizarlo? – YukiNyaa

2

Puede forzar el recolector de basura para recoger objetos no referenciados a través del método

GC.Collect() 

. La documentación es here.

9

No se puede fuerza C# para liberar memoria, pero se puede petición de que el CLR desasigna objetos sin referencia llamando

System.GC.Collect(); 

hay un método WaitForPendingFinalizers que "suspender el subproceso actual hasta que el hilo que está procesando la cola de finalizadores ha vaciado esa cola." Aunque no deberías necesitar llamarlo.

Como los otros han sugerido dirigirse al MSDN para obtener más información.

+0

GC.RunFinalizers? ¿donde es? No puedo encontrarlo en mi VS 2010 C# 4.0 –

+0

@ImranRizvi - aparentemente fue eliminado hace mucho tiempo - http://stackoverflow.com/a/12565583/59303. – ChrisF

+0

[documentación de MSDN] (https://msdn.microsoft.com/en-us/library/xe0c2357%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) en este método indica que * Fuerza un colección inmediata de basura de todas las generaciones * –

3

Es posible que desee echar un vistazo a este screencast^ de InfoQ.com. Presenta las partes internas del .NET Garbage Collector.

+0

+1 ¡Buena referencia! – CodeAngry

Cuestiones relacionadas