Clase System.GC

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

La GC clase controla el recolector de elementos no utilizados. El recolector de elementos no utilizados es un componente de Common Language Runtime que controla la asignación y liberación de la memoria administrada. Los métodos de esta clase influyen cuando se realiza la recolección de elementos no utilizados en un objeto y cuando se liberan los recursos asignados por un objeto. Las propiedades de esta clase proporcionan información sobre la cantidad total de memoria disponible en el sistema y la categoría de antigüedad, o generación, de memoria asignada a un objeto.

El recolector de elementos no utilizados realiza un seguimiento y reclama los objetos asignados en la memoria administrada. Periódicamente, el recolector de elementos no utilizados realiza la recolección de elementos no utilizados para reclamar la memoria asignada a los objetos para los que no hay referencias válidas. La recolección de elementos no utilizados se produce automáticamente cuando no se puede satisfacer una solicitud de memoria mediante la memoria libre disponible. Como alternativa, una aplicación puede forzar la recolección de elementos no utilizados mediante el Collect método .

La recolección de elementos no utilizados consta de los pasos siguientes:

  1. El recolector de elementos no utilizados busca objetos administrados a los que se hace referencia en código administrado.
  2. El recolector de elementos no utilizados intenta finalizar los objetos a los que no se hace referencia.
  3. El recolector de elementos no utilizados libera objetos a los que no se hace referencia y reclama su memoria.

Recursos no administrados

Durante una recolección, el recolector de elementos no utilizados no liberará un objeto si encuentra una o varias referencias al objeto en código administrado. Sin embargo, el recolector de elementos no utilizados no reconoce referencias a un objeto de código no administrado y podría liberar objetos que se usan exclusivamente en código no administrado a menos que se impida explícitamente hacerlo. El KeepAlive método proporciona un mecanismo que impide que el recolector de elementos no utilizados recopile objetos que todavía están en uso en código no administrado.

Además de las asignaciones de memoria administradas, las implementaciones del recolector de elementos no utilizados no mantienen información sobre los recursos mantenidos por un objeto, como identificadores de archivos o conexione de base de datos. Cuando un tipo usa recursos no administrados que se deben liberar antes de que se recuperen las instancias del tipo, el tipo puede implementar un finalizador.

En la mayoría de los casos, los finalizadores se implementan invalidando el Object.Finalize método; sin embargo, los tipos escritos en C# o C++ implementan destructores, que los compiladores convierten en una invalidación de Object.Finalize. En la mayoría de los casos, si un objeto tiene un finalizador, el recolector de elementos no utilizados lo llama antes de liberar el objeto. Sin embargo, no es necesario que el recolector de elementos no utilizados llame a finalizadores en todas las situaciones; Por ejemplo, el SuppressFinalize método impide explícitamente que se llame al finalizador de un objeto. Además, el recolector de elementos no utilizados no es necesario usar un subproceso específico para finalizar objetos o garantizar el orden en el que se llama a los finalizadores para los objetos que se hacen referencia entre sí, pero que de lo contrario están disponibles para la recolección de elementos no utilizados.

En escenarios en los que se deben liberar recursos en un momento específico, las clases pueden implementar la IDisposable interfaz , que contiene el IDisposable.Dispose método que realiza tareas de limpieza y administración de recursos. Las clases que implementan Dispose deben especificar, como parte de su contrato de clase, si y cuando los consumidores de clase llaman al método para limpiar el objeto. El recolector de elementos no utilizados no llama Dispose al método de forma predeterminada; sin embargo, las implementaciones del Dispose método pueden llamar a métodos de la GC clase para personalizar el comportamiento de finalización del recolector de elementos no utilizados.

Para obtener más información sobre la finalización de objetos y el patrón dispose, vea Limpieza de recursos no administrados.

Envejecimiento y generaciones de objetos

El recolector de elementos no utilizados de Common Language Runtime admite el envejecimiento de objetos mediante generaciones. Una generación es una unidad de medida de la antigüedad relativa de los objetos en la memoria. El número de generación, o la antigüedad, de un objeto indica la generación a la que pertenece un objeto. Los objetos creados más recientemente forman parte de las generaciones más recientes y tienen números de generación inferiores a los objetos creados anteriormente en el ciclo de vida de la aplicación. Los objetos de la generación más reciente están en la generación 0. Esta implementación del recolector de elementos no utilizados admite tres generaciones de objetos, generaciones 0, 1 y 2. Puede recuperar el valor de la MaxGeneration propiedad para determinar el número máximo de generación admitido por el sistema.

El envejecimiento de objetos permite a las aplicaciones dirigirse a la recolección de elementos no utilizados en un conjunto específico de generaciones en lugar de requerir que el recolector de elementos no utilizados evalúe todas las generaciones. Las sobrecargas del Collect método que incluyen un generation parámetro permiten especificar la generación más antigua que se va a recopilar como elementos no utilizados.

No permitir la recolección de elementos no utilizados

El recolector de elementos no utilizados admite un modo de latencia de región de GC que se puede usar durante la ejecución de rutas de acceso críticas en las que la recolección de elementos no utilizados puede afectar negativamente al rendimiento de una aplicación. El modo de latencia de región no gc requiere que especifique una cantidad de memoria que se puede asignar sin interferencias del recolector de elementos no utilizados. Si el tiempo de ejecución puede asignar esa memoria, el tiempo de ejecución no realizará una recolección de elementos no utilizados mientras se ejecuta el código en la ruta de acceso crítica.

Para definir el principio de la ruta de acceso crítica de la región no GC, llame a una de las sobrecargas de TryStartNoGCRegion. Para especificar el final de su ruta de acceso crítica, llame al EndNoGCRegion método .

No se pueden anidar llamadas al TryStartNoGCRegion método y solo debe llamar al EndNoGCRegion método si el tiempo de ejecución no está actualmente en modo de latencia de región de GC. En otras palabras, no debe llamar varias TryStartNoGCRegion veces (después de la primera llamada al método, las llamadas posteriores no se realizarán correctamente) y no debe esperar que las llamadas se EndNoGCRegion realicen correctamente simplemente porque la primera llamada a TryStartNoGCRegion se realizó correctamente.