GC.Collect Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Força a coleta de lixo.
Sobrecargas
Collect() |
Força uma coleta de lixo imediata de todas as gerações. |
Collect(Int32) |
Força uma coleta de lixo imediata da geração 0 por meio de uma geração especificada. |
Collect(Int32, GCCollectionMode) |
Força uma coleta de lixo imediata da geração 0 por meio de uma geração especificada, em uma hora especificada por um valor GCCollectionMode. |
Collect(Int32, GCCollectionMode, Boolean) |
Força uma coleta de lixo da geração 0 até uma geração especificada, em um momento especificado por um valor de GCCollectionMode, com um valor que especifica se a coleção deve ser de bloqueio. |
Collect(Int32, GCCollectionMode, Boolean, Boolean) |
Força uma coleta de lixo da geração 0 até uma geração especificada, em um momento especificado por um valor de GCCollectionMode, com valores que especificam se a coleta deve ser de bloqueio e compactação. |
Collect()
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
Força uma coleta de lixo imediata de todas as gerações.
public:
static void Collect();
public static void Collect ();
static member Collect : unit -> unit
Public Shared Sub Collect ()
Exemplos
O exemplo a seguir demonstra como usar o Collect método para executar uma coleção em todas as gerações de memória. O código gera vários objetos não utilizados e chama o Collect método para limpo-los da memória.
using namespace System;
const int maxGarbage = 1000;
void MakeSomeGarbage()
{
Version^ vt;
for ( int i = 0; i < maxGarbage; i++ ) {
// Create objects and release them to fill up memory with unused objects.
vt = gcnew Version;
}
}
void main()
{
// Put some objects in memory.
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 ) );
}
// The output from the example resembles the following:
// Memory used before collection: 79,392
// Memory used after full collection: 52,640
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
open System
let maxGarbage = 1000
let makeSomeGarbage () =
// Create objects and release them to fill up memory with unused objects.
for _ = 1 to maxGarbage do
Version() |> ignore
// Put some objects in memory.
makeSomeGarbage()
printfn $"Memory used before collection: {GC.GetTotalMemory false:N0}"
// Collect all generations of memory.
GC.Collect()
printfn $"Memory used after full collection: {GC.GetTotalMemory true:N0}"
// The output from the example resembles the following:
// Memory used before collection: 79,392
// Memory used after full collection: 52,640
Class MyGCCollectClass
Private Const maxGarbage As Integer = 1000
Shared Sub 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))
End Sub
Shared Sub MakeSomeGarbage()
Dim vt As Version
Dim i As Integer
For i = 0 To maxGarbage - 1
'Create objects and release them to fill up memory with unused objects.
vt = New Version()
Next
End Sub
End Class
' The output from the example resembles the following:
' Memory used before collection: 79,392
' Memory used after full collection: 52,640
Comentários
Use esse método para tentar recuperar toda a memória inacessível. Ele executa uma coleta de lixo de bloqueio de todas as gerações.
Todos os objetos, independentemente de quanto tempo estiverem na memória, são considerados para coleção; no entanto, os objetos referenciados no código gerenciado não são coletados. Use esse método para forçar o sistema a tentar recuperar a quantidade máxima de memória disponível.
Começando com o .NET Framework 4.5.1, você pode compactar o LOH (heap de objeto grande) definindo a GCSettings.LargeObjectHeapCompactionMode propriedade GCLargeObjectHeapCompactionMode.CompactOnce como antes de chamar o Collect método, como ilustra o exemplo a seguir.
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
GCSettings.LargeObjectHeapCompactionMode <- GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect()
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect()
Confira também
Aplica-se a
Collect(Int32)
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
Força uma coleta de lixo imediata da geração 0 por meio de uma geração especificada.
public:
static void Collect(int generation);
public static void Collect (int generation);
static member Collect : int -> unit
Public Shared Sub Collect (generation As Integer)
Parâmetros
- generation
- Int32
O número da geração mais antiga a ser coletada como lixo.
Exceções
generation
não é válido.
Exemplos
O exemplo a seguir demonstra como usar o Collect método para executar uma coleção em camadas individuais de memória. O código gera vários objetos não utilizados e chama o Collect método para limpo-los da memória.
using namespace System;
const long maxGarbage = 1000;
ref class MyGCCollectClass
{
public:
void MakeSomeGarbage()
{
Version^ vt;
for ( int i = 0; i < maxGarbage; i++ )
{
// Create objects and release them to fill up memory
// with unused objects.
vt = gcnew Version;
}
}
};
int main()
{
MyGCCollectClass^ myGCCol = gcnew 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 ) );
}
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();
}
}
}
}
open System
let maxGarbage = 1000
type MyGCCollectClass() =
member _.MakeSomeGarbage() =
for _ = 1 to maxGarbage do
// Create objects and release them to fill up memory with unused objects.
Version() |> ignore
[<EntryPoint>]
let main _ =
let myGCCol = MyGCCollectClass()
// Determine the maximum number of generations the system
// garbage collector currently supports.
printfn $"The highest generation is {GC.MaxGeneration}"
myGCCol.MakeSomeGarbage()
// Determine which generation myGCCol object is stored in.
printfn $"Generation: {GC.GetGeneration myGCCol}"
// Determine the best available approximation of the number
// of bytes currently allocated in managed memory.
printfn $"Total Memory: {GC.GetTotalMemory false}"
// Perform a collection of generation 0 only.
GC.Collect 0
// Determine which generation myGCCol object is stored in.
printfn $"Generation: {GC.GetGeneration myGCCol}"
printfn $"Total Memory: {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.
printfn $"Generation: {GC.GetGeneration myGCCol}"
printfn $"Total Memory: {GC.GetTotalMemory false}"
0
Namespace GCCollectInt_Example
Class MyGCCollectClass
Private maxGarbage As Long = 10000
Public Shared Sub Main()
Dim myGCCol As 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()
End Sub
Sub MakeSomeGarbage()
Dim vt As Version
Dim i As Integer
For i = 0 To maxGarbage - 1
'Create objects and release them to fill up memory
'with unused objects.
vt = New Version
Next i
End Sub
End Class
End Namespace
Comentários
Use esse método para tentar recuperar a memória inacessível. No entanto, o uso desse método não garante que toda a memória inacessível na geração especificada seja recuperada.
Se o envelhecimento do objeto for implementado, o coletor de lixo não coletará objetos com um número de geração maior que a geração especificada. Se o envelhecimento do objeto não for implementado, o coletor de lixo considerará todos os objetos durante a coleta de lixo.
Use a MaxGeneration propriedade para determinar o valor máximo válido do generation
parâmetro.
Para que o coletor de lixo considere todos os objetos independentemente de sua geração, use a versão desse método que não usa parâmetros. Para que o coletor de lixo recupere objetos com base em uma GCCollectionMode configuração, use a sobrecarga do GC.Collect(Int32, GCCollectionMode) método.
Confira também
Aplica-se a
Collect(Int32, GCCollectionMode)
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
Força uma coleta de lixo imediata da geração 0 por meio de uma geração especificada, em uma hora especificada por um valor GCCollectionMode.
public:
static void Collect(int generation, GCCollectionMode mode);
public static void Collect (int generation, GCCollectionMode mode);
static member Collect : int * GCCollectionMode -> unit
Public Shared Sub Collect (generation As Integer, mode As GCCollectionMode)
Parâmetros
- generation
- Int32
O número da geração mais antiga a ser coletada como lixo.
- mode
- GCCollectionMode
Um valor de enumeração que especifica se a coleta de lixo é forçada (Default ou Forced) ou otimizada (Optimized).
Exceções
Exemplos
O exemplo a seguir força uma coleta de lixo para objetos de geração 2 com a Optimized configuração .
using System;
class Program
{
static void Main(string[] args)
{
GC.Collect(2, GCCollectionMode.Optimized);
}
}
open System
GC.Collect(2, GCCollectionMode.Optimized)
Class Program
Public Shared Sub Main()
GC.Collect(2, GCCollectionMode.Optimized)
End Sub
End Class
Comentários
Use o mode
parâmetro para especificar se a coleta de lixo deve ocorrer imediatamente ou somente se o tempo for ideal para recuperar objetos. O uso desse método não garante que toda a memória inacessível na geração especificada seja recuperada.
Para ajustar a intrusão da coleta de lixo durante períodos críticos em seu aplicativo, defina a LatencyMode propriedade .
O coletor de lixo não coleta objetos com um número de geração maior do que o especificado pelo generation
parâmetro . Use a MaxGeneration propriedade para determinar o valor máximo válido de generation
.
Para que o coletor de lixo considere todos os objetos independentemente de sua geração, use a versão desse método que não usa parâmetros.
Para que o coletor de lixo recupere objetos até uma geração especificada de objetos, use a sobrecarga do GC.Collect(Int32) método. Quando você especifica a geração máxima, todos os objetos são coletados.
Confira também
Aplica-se a
Collect(Int32, GCCollectionMode, Boolean)
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
Força uma coleta de lixo da geração 0 até uma geração especificada, em um momento especificado por um valor de GCCollectionMode, com um valor que especifica se a coleção deve ser de bloqueio.
public:
static void Collect(int generation, GCCollectionMode mode, bool blocking);
public static void Collect (int generation, GCCollectionMode mode, bool blocking);
static member Collect : int * GCCollectionMode * bool -> unit
Public Shared Sub Collect (generation As Integer, mode As GCCollectionMode, blocking As Boolean)
Parâmetros
- generation
- Int32
O número da geração mais antiga a ser coletada como lixo.
- mode
- GCCollectionMode
Um valor de enumeração que especifica se a coleta de lixo é forçada (Default ou Forced) ou otimizada (Optimized).
- blocking
- Boolean
true
para executar uma coleta de lixo de bloqueio; false
para executar uma coleta de lixo em segundo plano sempre que possível.
Exceções
Comentários
A tabela a seguir resume a interação dos mode
parâmetros e blocking
:
mode |
blocking é true |
blocking é false |
---|---|---|
Forced ou Default | Uma coleção de bloqueio é executada assim que possível. Se uma coleção em segundo plano estiver em andamento e generation for 0 ou 1, o Collect(Int32, GCCollectionMode, Boolean) método disparará imediatamente uma coleção de bloqueio e retornará quando a coleção for concluída. Se uma coleção em segundo plano estiver em andamento e generation for 2, o método aguardará até que a coleção em segundo plano seja concluída, disparará uma coleção de 2 geração de bloqueio e retornará. |
Uma coleta é executada assim que possível. O método Collect(Int32, GCCollectionMode, Boolean) solicita uma coleta em segundo plano, mas isso não é garantido; dependendo das circunstâncias, uma coleta de bloqueio ainda pode ser executada. Se uma coleta em segundo plano já estiver em andamento, o método retornará imediatamente. |
Optimized | Uma coleta de bloqueio pode ser executada, dependendo do estado do coletor de lixo e do parâmetro generation . O coletor de lixo tenta fornecer um desempenho ideal. |
Uma coleta pode ser executada, dependendo do estado do coletor de lixo. O método Collect(Int32, GCCollectionMode, Boolean) solicita uma coleta em segundo plano, mas isso não é garantido; dependendo das circunstâncias, uma coleta de bloqueio ainda pode ser executada. O coletor de lixo tenta fornecer um desempenho ideal. Se uma coleta em segundo plano já estiver em andamento, o método retornará imediatamente. |
Se uma chamada para o Collect(Int32, GCCollectionMode, Boolean) método executar uma coleta de lixo de bloqueio completo, você também poderá compactar o heap de objetos grandes definindo a GCSettings.LargeObjectHeapCompactionMode propriedade como GCLargeObjectHeapCompactionMode.CompactOnce antes de chamar o Collect método .
Aplica-se a
Collect(Int32, GCCollectionMode, Boolean, Boolean)
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
- Origem:
- GC.CoreCLR.cs
Força uma coleta de lixo da geração 0 até uma geração especificada, em um momento especificado por um valor de GCCollectionMode, com valores que especificam se a coleta deve ser de bloqueio e compactação.
public:
static void Collect(int generation, GCCollectionMode mode, bool blocking, bool compacting);
public static void Collect (int generation, GCCollectionMode mode, bool blocking, bool compacting);
static member Collect : int * GCCollectionMode * bool * bool -> unit
Public Shared Sub Collect (generation As Integer, mode As GCCollectionMode, blocking As Boolean, compacting As Boolean)
Parâmetros
- generation
- Int32
O número da geração mais antiga a ser coletada como lixo.
- mode
- GCCollectionMode
Um valor de enumeração que especifica se a coleta de lixo é forçada (Default ou Forced) ou otimizada (Optimized).
- blocking
- Boolean
true
para executar uma coleta de lixo de bloqueio; false
para executar uma coleta de lixo em segundo plano sempre que possível.
- compacting
- Boolean
true
para compactar o heap de objetos pequenos; false
para somente limpar.
Comentários
Se blocking
for false
, o GC decidirá se deseja executar uma coleta de lixo em segundo plano ou de bloqueio. Se compacting
for true
, ele executará uma coleta de lixo de bloqueio.
Se compacting
for true
, o runtime compacta o SOH (heap de objeto pequeno). O LOH (heap de objeto grande) não é compactado, a menos que a GCSettings.LargeObjectHeapCompactionMode propriedade esteja definida como GCLargeObjectHeapCompactionMode.CompactOnce. Observe que isso inclui todas as coletas de lixo de bloqueio, não apenas coletas de lixo de bloqueio completo.
Você pode chamar o Collect(Int32, GCCollectionMode, Boolean, Boolean) método para reduzir o heap gerenciado para o menor tamanho possível, como ilustra o fragmento de código a seguir.
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect(2, GCCollectionMode.Forced, true, true);
GCSettings.LargeObjectHeapCompactionMode <- GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect(2, GCCollectionMode.Forced, true, true)
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce
GC.Collect(2, GCCollectionMode.Forced, True, True)
Especificar true
para o compacting
argumento garante uma coleta de lixo de compactação completa de bloqueio. Definir a GCSettings.LargeObjectHeapCompactionMode propriedade para GCLargeObjectHeapCompactionMode.CompactOnce garantir que o LOH e o SOH sejam compactados.