GC.Collect Método

Definición

Fuerza a que se lleve a cabo la recolección de elementos no utilizados.

Sobrecargas

Collect()

Fuerza a que se lleve a cabo una recolección de elementos no utilizados de todas las generaciones.

Collect(Int32)

Fuerza a que se lleve a cabo inmediatamente la recolección de elementos no utilizados desde la generación 0 hasta la generación especificada.

Collect(Int32, GCCollectionMode)

Fuerza una recolección de elementos no utilizados desde la generación 0 hasta la generación especificada, en el momento especificado por el valor GCCollectionMode.

Collect(Int32, GCCollectionMode, Boolean)

Fuerza una recolección de elementos no utilizados de generación 0 en una generación especificada, en un momento especificado por un valor de GCCollectionMode, con un valor que especifica si la recolección debe ser de bloqueo.

Collect(Int32, GCCollectionMode, Boolean, Boolean)

Fuerza una recolección de elementos no utilizados de generación 0 en una generación especificada, en un momento especificado por un valor de GCCollectionMode, con valores que especifican si la recolección debe ser de bloqueo y compactante.

Collect()

Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs

Fuerza a que se lleve a cabo una recolección de elementos no utilizados de todas las generaciones.

public static void Collect ();

Ejemplos

En el ejemplo siguiente se muestra cómo usar el Collect método para realizar una colección en todas las generaciones de memoria. El código genera una serie de objetos no utilizado y, a continuación, llama al Collect método para limpiarlos de la memoria.

using System;

class MyGCCollectClass
{
   private const int maxGarbage = 1000;

   static void Main()
   {
      // Put some objects in memory.
      MyGCCollectClass.MakeSomeGarbage();
      Console.WriteLine("Memory used before collection:       {0:N0}",
                        GC.GetTotalMemory(false));

      // Collect all generations of memory.
      GC.Collect();
      Console.WriteLine("Memory used after full collection:   {0:N0}",
                        GC.GetTotalMemory(true));
   }

   static void MakeSomeGarbage()
   {
      Version vt;

      // Create objects and release them to fill up memory with unused objects.
      for(int i = 0; i < maxGarbage; i++) {
         vt = new Version();
      }
   }
}
// The output from the example resembles the following:
//       Memory used before collection:       79,392
//       Memory used after full collection:   52,640

Comentarios

Use este método para intentar reclamar toda la memoria inaccesible. Realiza una recolección de elementos no utilizados de bloqueo de todas las generaciones.

Todos los objetos, independientemente de cuánto tiempo hayan estado en memoria, se consideran para la colección; sin embargo, los objetos a los que se hace referencia en el código administrado no se recopilan. Use este método para forzar al sistema a intentar reclamar la cantidad máxima de memoria disponible.

A partir de .NET Framework 4.5.1, puede compactar el montón de objetos grandes (LOH) estableciendo la GCSettings.LargeObjectHeapCompactionMode propiedad GCLargeObjectHeapCompactionMode.CompactOnce en antes de llamar al Collect método , como se muestra en el ejemplo siguiente.

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();

Consulte también

Se aplica a

Collect(Int32)

Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs

Fuerza a que se lleve a cabo inmediatamente la recolección de elementos no utilizados desde la generación 0 hasta la generación especificada.

public static void Collect (int generation);

Parámetros

generation
Int32

El número de la generación más antigua de elementos no usados para recolectar.

Excepciones

generation no es válido.

Ejemplos

En el ejemplo siguiente se muestra cómo usar el Collect método para realizar una colección en capas individuales de memoria. El código genera una serie de objetos no utilizado y, a continuación, llama al Collect método para limpiarlos de la memoria.

using System;

namespace GCCollectIntExample
{
    class MyGCCollectClass
    {
        private const long maxGarbage = 1000;

        static void Main()
        {
            MyGCCollectClass myGCCol = new MyGCCollectClass();

            // Determine the maximum number of generations the system
        // garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

            myGCCol.MakeSomeGarbage();

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            // Determine the best available approximation of the number
        // of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of generation 0 only.
            GC.Collect(0);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of all generations up to and including 2.
            GC.Collect(2);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            Console.Read();
        }

        void MakeSomeGarbage()
        {
            Version vt;

            for(int i = 0; i < maxGarbage; i++)
            {
                // Create objects and release them to fill up memory
        // with unused objects.
                vt = new Version();
            }
        }
    }
}

Comentarios

Use este método para intentar recuperar la memoria inaccesible. Sin embargo, el uso de este método no garantiza que se recupere toda la memoria inaccesible de la generación especificada.

Si se implementa el envejecimiento de objetos, el recolector de elementos no utilizados no recopila objetos con un número de generación mayor que la generación especificada. Si no se implementa el envejecimiento de objetos, el recolector de elementos no utilizados considera todos los objetos durante la recolección de elementos no utilizados.

Use la MaxGeneration propiedad para determinar el valor máximo válido del generation parámetro.

Para que el recolector de elementos no utilizados tenga en cuenta todos los objetos independientemente de su generación, use la versión de este método que no toma ningún parámetro. Para que el recolector de elementos no utilizados recupere objetos en función de una GCCollectionMode configuración, use la sobrecarga del GC.Collect(Int32, GCCollectionMode) método .

Consulte también

Se aplica a

Collect(Int32, GCCollectionMode)

Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs

Fuerza una recolección de elementos no utilizados desde la generación 0 hasta la generación especificada, en el momento especificado por el valor GCCollectionMode.

public static void Collect (int generation, GCCollectionMode mode);

Parámetros

generation
Int32

El número de la generación más antigua de elementos no usados para recolectar.

mode
GCCollectionMode

Un valor de enumeración que especifica si se fuerza la recolección de elementos (Default o Forced) o si será optimizada (Optimized).

Excepciones

generation no es válido.

O bien

mode no es uno de los valores de GCCollectionMode .

Ejemplos

En el ejemplo siguiente se fuerza una recolección de elementos no utilizados para los objetos de generación 2 con la Optimized configuración .

using System;

class Program
{
    static void Main(string[] args)
    {
        GC.Collect(2, GCCollectionMode.Optimized);
    }
}

Comentarios

Use el mode parámetro para especificar si la recolección de elementos no utilizados debe producirse inmediatamente o solo si el tiempo es óptimo para reclamar objetos. El uso de este método no garantiza que se recupere toda la memoria inaccesible de la generación especificada.

Para ajustar la intrusión de la recolección de elementos no utilizados durante períodos críticos en la aplicación, establezca la LatencyMode propiedad .

El recolector de elementos no utilizados no recopila objetos con un número de generación superior al especificado por el generation parámetro . Utilice la MaxGeneration propiedad para determinar el valor máximo válido de generation.

Para que el recolector de elementos no utilizados tenga en cuenta todos los objetos independientemente de su generación, use la versión de este método que no toma ningún parámetro.

Para que el recolector de elementos no utilizados recupere objetos hasta una generación especificada de objetos, use la sobrecarga del GC.Collect(Int32) método . Al especificar la generación máxima, se recopilan todos los objetos.

Consulte también

Se aplica a

Collect(Int32, GCCollectionMode, Boolean)

Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs

Fuerza una recolección de elementos no utilizados de generación 0 en una generación especificada, en un momento especificado por un valor de GCCollectionMode, con un valor que especifica si la recolección debe ser de bloqueo.

public static void Collect (int generation, GCCollectionMode mode, bool blocking);

Parámetros

generation
Int32

El número de la generación más antigua de elementos no usados para recolectar.

mode
GCCollectionMode

Un valor de enumeración que especifica si se fuerza la recolección de elementos (Default o Forced) o si será optimizada (Optimized).

blocking
Boolean

true para realizar una recolección de elementos no utilizados de bloqueo; false para realizar una recolección de elementos no utilizados en segundo plano cuando sea posible.

Excepciones

generation no es válido.

O bien

mode no es uno de los valores de GCCollectionMode .

Comentarios

En la tabla siguiente se resume la interacción de los mode parámetros y blocking :

mode blocking es true blocking es 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 generation es 0 o 1, el Collect(Int32, GCCollectionMode, Boolean) método desencadena inmediatamente una colección de bloqueo y devuelve cuando finaliza la colección. Si una colección en segundo plano está en curso y generation es 2, el método espera hasta que finaliza la colección en segundo plano, desencadena una colección de bloqueo de generación 2 y, a continuación, devuelve. 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.

Si una llamada al Collect(Int32, GCCollectionMode, Boolean) método realiza una recolección completa de elementos no utilizados de bloqueo, también puede compactar el montón de objetos grandes estableciendo la GCSettings.LargeObjectHeapCompactionMode propiedad GCLargeObjectHeapCompactionMode.CompactOnce en antes de llamar al Collect método .

Se aplica a

Collect(Int32, GCCollectionMode, Boolean, Boolean)

Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs
Source:
GC.CoreCLR.cs

Fuerza una recolección de elementos no utilizados de generación 0 en una generación especificada, en un momento especificado por un valor de GCCollectionMode, con valores que especifican si la recolección debe ser de bloqueo y compactante.

public static void Collect (int generation, GCCollectionMode mode, bool blocking, bool compacting);

Parámetros

generation
Int32

El número de la generación más antigua de elementos no usados para recolectar.

mode
GCCollectionMode

Un valor de enumeración que especifica si se fuerza la recolección de elementos (Default o Forced) o si será optimizada (Optimized).

blocking
Boolean

true para realizar una recolección de elementos no utilizados de bloqueo; false para realizar una recolección de elementos no utilizados en segundo plano cuando sea posible.

compacting
Boolean

true para compactar el montón de objetos pequeños; false solo para limpiar.

Comentarios

Si blocking es false, el GC decide si se debe realizar un fondo o una recolección de elementos no utilizados de bloqueo. Si compacting es true, realiza una recolección de elementos no utilizados de bloqueo.

Si compacting es true, el tiempo de ejecución compacta el montón de objetos pequeños (SOH). El montón de objetos grandes (LOH) no se compacta a menos que la GCSettings.LargeObjectHeapCompactionMode propiedad esté establecida GCLargeObjectHeapCompactionMode.CompactOnceen . Tenga en cuenta que esto incluye todo el bloqueo de recolecciones de elementos no utilizados, no solo de bloqueo total de recolecciones de elementos no utilizados.

Puede llamar al Collect(Int32, GCCollectionMode, Boolean, Boolean) método para reducir el montón administrado al tamaño más pequeño posible, como se muestra en el fragmento de código siguiente.

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect(2, GCCollectionMode.Forced, true, true);

Especificar true para el compacting argumento garantiza una recolección de elementos no utilizados de bloqueo completo y compactado. Establecer la GCSettings.LargeObjectHeapCompactionMode propiedad en GCLargeObjectHeapCompactionMode.CompactOnce garantiza que se compactan tanto loH como SOH.

Se aplica a