Colecciones inducidas
En la mayoría de los casos, el recolector de elementos no utilizados puede determinar cuál es el mejor momento para realizar una recolección y se debe permitir su ejecución de forma independiente. Hay ocasiones excepcionales en que una recolección forzada puede mejorar el rendimiento de la aplicación. En estos casos, se puede inducir la recolección de elementos no utilizados utilizando el método GC.Collect para forzar una recolección de elementos no utilizados.
Use el método GC.Collect cuando haya una reducción significativa de la cantidad de memoria que se está usando en un punto específico del código de la aplicación. Por ejemplo, si la aplicación utiliza un cuadro de diálogo complejo que tiene varios controles, llamar a Collect cuando se cierra el cuadro de diálogo podría mejorar el rendimiento porque reclama inmediatamente la memoria que usa este. Asegúrese de que la aplicación no induce la recolección de elementos no utilizados con demasiada frecuencia, ya que este hecho puede reducir el rendimiento si el recolector de elementos no utilizados intenta reclamar objetos en el momento inadecuado. Puede proporcionar un valor de enumeración GCCollectionMode.Optimized al método Collect para recopilarlo solo cuando la recolección sea productiva, como se explica en la sección siguiente.
Modo de colección de GC
Puede usar una de las sobrecargas del método GC.Collect, que incluye un valor GCCollectionMode para especificar el comportamiento de una colección forzada, como se indica a continuación.
Valor de GCCollectionMode |
Descripción |
---|---|
Default | Usa el valor predeterminado de la recolección de elementos no utilizados para la versión de .NET en ejecución. |
Forced | Obliga a que la recolección de elementos no utilizados se produzca inmediatamente. Esto equivale a llamar a la sobrecarga GC.Collect(). Tiene como consecuencia una recolección completa de bloqueo de todas las generaciones. También puede compactar el montón de objetos grandes si establece la propiedad GCSettings.LargeObjectHeapCompactionMode en GCLargeObjectHeapCompactionMode.CompactOnce antes de forzar una recolección de elementos no utilizados de bloqueo completa inmediata. |
Optimized | Permite al recolector de elementos no utilizados determinar si la hora actual es la adecuada para reclamar objetos. El recolector de elementos no utilizados puede determinar que una recolección no esté justificada por su insuficiente productividad, en cuyo caso volverá sin reclamar objetos. |
Colecciones de fondo o de bloqueo
Puede llamar a la sobrecarga del método GC.Collect(Int32, GCCollectionMode, Boolean) para especificar si una recolección inducida se está bloqueando o no. El tipo de colección realizado depende de una combinación de los parámetros mode
y blocking
del método. mode
es un miembro de la enumeración GCCollectionMode y blocking
es un valor Boolean. En la tabla siguiente se resume la interacción de los argumentos mode
y blocking
.
mode |
blocking = true |
blocking = false |
---|---|---|
Forced o Default | Se realiza una recolección de bloqueo lo antes posible. Si una colección en segundo plano está en curso y la generación es 0 o 1, el método Collect(Int32, GCCollectionMode, Boolean) desencadena inmediatamente una colección de bloqueo y vuelve cuando la colección finaliza. Si una colección en segundo plano está en curso y el parámetro generation es 2, el método espera hasta que finaliza la colección en segundo plano, desencadena una generación de bloqueo 2 y luego vuelve. |
Se realiza una recolección lo antes posible. El método Collect(Int32, GCCollectionMode, Boolean) solicita una colección en segundo plano, pero esto no se garantiza; puede que aún se realice una colección de bloqueo, dependiendo de las circunstancias. Si una colección en segundo plano ya está en curso, el método vuelve inmediatamente. |
Optimized | Se puede realizar una recolección de bloqueo, dependiendo del estado del recolector de elementos no utilizados y del parámetro generation . El recolector de elementos no utilizados intenta proporcionar un rendimiento óptimo. |
Se puede realizar una recolección, según el estado del recolector de elementos no utilizados. El método Collect(Int32, GCCollectionMode, Boolean) solicita una colección en segundo plano, pero esto no se garantiza; puede que aún se realice una colección de bloqueo, dependiendo de las circunstancias. El recolector de elementos no utilizados intenta proporcionar un rendimiento óptimo. Si una colección en segundo plano ya está en curso, el método vuelve inmediatamente. |