2011-11-10 16 views
6

Un punto se está preguntando en mi mente desde hace algunos días. Quiero saber cómo funciona el recolector de basura con clases estáticas, variables?Recolector de basura y clase estática, variable

Como todos sabemos El recolector de basura realiza un seguimiento de los objetos que se han creado en la aplicación y los elimina automáticamente cuando ya no están en uso. Para la clase estática, no se crea ningún objeto y se carga en la memoria con la depuración de la aplicación.

¿Así que el recolector de basura maneja las clases estáticas?

Respuesta

9

No es necesario eliminar las clases estáticas, ya que no son objetos y no consumen memoria (salvo el código de clase real que carga la infraestructura .NET). Por otro lado, los campos estáticos en clases estáticas son objetos que consumen memoria. No se recopilarán, ya que son accesibles durante toda la vida útil de la aplicación. Si desea liberar la memoria, debe establecer el campo como nulo para que el objeto al que apunta el campo sea elegible para GC

+0

Bien, su punto es que el recolector de basura nunca libera campos estáticos o variables que significan que siempre están cargados en la memoria. Entonces, ¿tendrá derecho a decir que la estática debería crearse solo para const o variables globales? –

+3

Existe una excepción: en .Net 4, puede tener ensamblajes coleccionables. Y si un conjunto es basura recolectada, los campos estáticos de los tipos en este ensamblaje dejan de ser raíces de GC, por lo que los objetos a los que hacen referencia se pueden recopilar. – svick

+0

@svick eso es bastante interesante gracias. También puede valer la pena señalar que los campos en clases estáticas se instancian cuando se accede por primera vez a la clase y no cuando se inicia el programa. – Stilgar

1

Él nunca va a liberarlos. (por ejemplo, en WEB hasta el reinicio del IIS).

Nunca va a decir: "Nadie me está haciendo referencia, así que estoy libre de ir"

también

nunca se puede hacer a nueva clase estática .... por lo que sus usos es simplemente por el objeto Class (no la instancia).

So .net no arriesga y lo mantiene fuera del GC.

+0

gracias por revertir Royi, tengo su punto –

Cuestiones relacionadas