GC Classe

Definição

Controla o coletor de lixo do sistema, um serviço que recupera automaticamente memória não utilizada.

public ref class GC abstract sealed
public ref class GC sealed
public static class GC
public sealed class GC
type GC = class
Public Class GC
Public NotInheritable Class GC
Herança
GC

Exemplos

O exemplo seguinte utiliza vários métodos GC para obter informação de geração e memória sobre um bloco de objetos não utilizados e imprimi-la na consola. Os objetos não utilizados são então recolhidos e os totais de memória resultantes são exibidos.

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

Observações

A GC classe controla o coletor de lixo. O coletor de lixo é um componente do tempo de execução de uma linguagem comum que controla a alocação e liberação de memória gerida. Os métodos nessa classe influenciam quando a coleta de lixo é executada em um objeto e quando os recursos alocados por um objeto são liberados. As propriedades nesta classe fornecem informações sobre a quantidade total de memória disponível no sistema e a categoria etária, ou geração, de memória alocada a um objeto.

O coletor de lixo rastreia e recupera objetos alocados na memória gerenciada. Periodicamente, o coletor de lixo realiza a coleta de lixo para recuperar a memória alocada a objetos para os quais não há referências válidas. A coleta de lixo acontece automaticamente quando uma solicitação de memória não pode ser satisfeita usando a memória livre disponível. Como alternativa, um aplicativo pode forçar a coleta de lixo usando o Collect método.

A recolha de lixo consiste nos seguintes passos:

  1. O coletor de lixo procura objetos gerenciados que são referenciados no código gerenciado.
  2. O coletor de lixo tenta finalizar objetos que não são referenciados.
  3. O coletor de lixo libera objetos que não são referenciados e recupera sua memória.

Recursos não geridos

Durante uma coleta, o coletor de lixo não liberará um objeto se encontrar uma ou mais referências ao objeto no código gerenciado. No entanto, o coletor de lixo não reconhece referências a um objeto a partir de código não gerenciado e pode liberar objetos que estão a ser usados exclusivamente em código não gerenciado, a menos que esteja explicitamente prevenido de fazê-lo. O KeepAlive método fornece um mecanismo que impede que o coletor de lixo colete objetos que ainda estão em uso em código não gerenciado.

Exceto em relação às alocações de memória gerenciada, as implementações do coletor de lixo não mantêm informações sobre os recursos que um objeto possui, como identificadores de arquivos ou conexões de banco de dados. Quando um tipo usa recursos não gerenciados que devem ser liberados antes que instâncias do tipo sejam recuperadas, o tipo pode implementar um finalizador.

Na maioria dos casos, os finalizadores são implementados substituindo o método Object.Finalize; no entanto, os tipos escritos em C# ou C++ implementam destrutores, que os compiladores transformam em uma substituição para Object.Finalize. Na maioria dos casos, se um objeto tiver um finalizador, o coletor de lixo o chamará antes de liberar o objeto. No entanto, o coletor de lixo não é obrigado a chamar finalizadores em todas as situações; por exemplo, o método SuppressFinalize impede explicitamente que o finalizador de um objeto seja chamado. Além disso, o coletor de lixo não é obrigado a usar um thread específico para finalizar objetos, ou garantir a ordem em que os finalizadores são chamados para objetos que fazem referência uns aos outros, mas estão disponíveis para coleta de lixo.

Em cenários em que os recursos devem ser liberados em um momento específico, as classes podem implementar a IDisposable interface, que contém o IDisposable.Dispose método que executa tarefas de gerenciamento e limpeza de recursos. As classes que implementam Dispose devem especificar, como parte do seu contrato de classe, se e quando os utilizadores da classe chamam o método para limpar o objeto. O coletor de lixo não chama, por padrão, o Dispose método, no entanto, as Dispose implementações do método podem chamar métodos na GC classe para personalizar o comportamento de finalização do coletor de lixo.

Para obter mais informações sobre a finalização de objetos e o padrão de descarte, consulte Limpando recursos não gerenciados.

Envelhecimento de objetos e gerações

O coletor de lixo no Common Language Runtime suporta o envelhecimento de objetos usando gerações. Uma geração é uma unidade de medida da idade relativa dos objetos na memória. O número de geração, ou idade, de um objeto indica a geração à qual um objeto pertence. Os objetos criados mais recentemente fazem parte das gerações mais recentes e têm números de geração mais baixos do que os objetos criados anteriormente no ciclo de vida do aplicativo. Os objetos da geração mais recente estão na geração 0. Esta implementação do coletor de lixo suporta três gerações de objetos, gerações 0, 1 e 2. Você pode recuperar o valor da propriedade para determinar o número máximo de geração suportado MaxGeneration pelo sistema.

O envelhecimento de objetos permite que os aplicativos direcionem a coleta de lixo para um conjunto específico de gerações, em vez de exigir que o coletor de lixo avalie todas as gerações. As sobrecargas do Collect método que incluem um generation parâmetro permitem que especifique a geração mais antiga sujeita à recolha de lixo.

Não permitir a recolha de lixo

O coletor de lixo suporta um modo de latência de região sem GC que é utilizado durante a execução de caminhos críticos nos quais a coleta de lixo afeta negativamente o desempenho de uma aplicação. O modo de latência sem região GC requer que você especifique uma quantidade de memória que pode ser alocada sem interferência do coletor de lixo. Se o tempo de execução puder alocar essa memória, o tempo de execução não executará uma coleta de lixo enquanto o código no caminho crítico estiver em execução.

Você define o início do caminho crítico da região sem GC chamando uma das sobrecargas do TryStartNoGCRegion. Você especifica o final de seu caminho crítico chamando o EndNoGCRegion método.

Não é possível aninhar chamadas para o TryStartNoGCRegion método e você só deve chamar o EndNoGCRegion método se o tempo de execução estiver atualmente em nenhum modo de latência de região GC. Em outras palavras, você não deve ligar TryStartNoGCRegion várias vezes (após a primeira chamada de método, as chamadas subsequentes não terão êxito), e você não deve esperar que as chamadas EndNoGCRegion sejam bem-sucedidas apenas porque a primeira chamada foi TryStartNoGCRegion bem-sucedida.

Propriedades

Name Descrição
MaxGeneration

Obtém o número máximo de gerações que o sistema suporta atualmente.

Métodos

Name Descrição
AddMemoryPressure(Int64)

Informa o tempo de execução de uma grande alocação de memória não gerida que deve ser tida em conta ao agendar a recolha de lixo.

AllocateArray<T>(Int32, Boolean)

Aloca um array.

AllocateUninitializedArray<T>(Int32, Boolean)

Aloca um array saltando a inicialização zero, se possível.

CancelFullGCNotification()

Cancela o registo de uma notificação de recolha de lixo.

Collect()

Força uma recolha imediata de lixo de todas as gerações.

Collect(Int32, GCCollectionMode, Boolean, Boolean)

Força uma recolha de lixo desde a geração 0 até uma geração especificada, num momento especificado por um GCCollectionMode valor, com valores que especificam se a coleção deve bloquear e compactar.

Collect(Int32, GCCollectionMode, Boolean)

Força uma recolha de lixo desde a geração 0 até uma geração especificada, num momento especificado por um GCCollectionMode valor, com um valor que especifica se a coleção deve estar a bloquear.

Collect(Int32, GCCollectionMode)

Força uma recolha de lixo desde a geração 0 até uma geração especificada, num momento especificado por um GCCollectionMode valor.

Collect(Int32)

Força uma recolha imediata de lixo desde a geração 0 até uma geração especificada.

CollectionCount(Int32)

Devolve o número de vezes que ocorreu recolha de lixo para a geração especificada de objetos.

EndNoGCRegion()

Termina o modo de latência da região sem GC.

GetAllocatedBytesForCurrentThread()

Obtém o número total de bytes alocados à thread atual desde o início da sua vida útil.

GetConfigurationVariables()

Obtém as configurações usadas pelo coletor de lixo.

GetGCMemoryInfo()

Obtém informação de memória de recolha de lixo.

GetGCMemoryInfo(GCKind)

Obtém informação de memória de recolha de lixo.

GetGeneration(Object)

Devolve o número de geração atual do objeto especificado.

GetGeneration(WeakReference)

Devolve o número de geração atual do alvo de uma referência fraca especificada.

GetTotalAllocatedBytes(Boolean)

Obtém a contagem dos bytes alocados ao longo da vida útil do processo. O valor retornado não inclui nenhuma alocação nativa.

GetTotalMemory(Boolean)

Recupera o tamanho do heap, excluindo fragmentação. Por exemplo, se o tamanho total do heap GC for 100mb e a fragmentação, ou seja, o espaço ocupado por objetos livres, ocupar 40mb, esta API reportaria 60mb. Um parâmetro indica se este método pode esperar um curto intervalo antes de regressar, permitindo ao sistema recolher lixo e finalizar os objetos.

GetTotalPauseDuration()

Obtém o tempo total pausado no GC desde o início do processo.

KeepAlive(Object)

Faz referência ao objeto especificado, o que o torna inelegível para recolha de lixo desde o início da rotina atual até ao momento em que este método é chamado.

RefreshMemoryLimit()

Instrui o Coletor de Lixo a reconfigurar-se detetando os vários limites de memória no sistema.

RegisterForFullGCNotification(Int32, Int32)

Especifica que deve ser emitida uma notificação de recolha de lixo quando as condições favorecem a recolha total e quando a recolha estiver concluída.

RegisterNoGCRegionCallback(Int64, Action)

Regista um callback a ser invocado quando uma certa quantidade de memória é alocada na região sem GC.

RemoveMemoryPressure(Int64)

Informa o runtime de que a memória não gerida foi libertada e já não precisa de ser tida em conta ao agendar a recolha do lixo.

ReRegisterForFinalize(Object)

Solicita que o sistema chame o finalizador para o objeto especificado para o qual SuppressFinalize(Object) já foi chamado.

SuppressFinalize(Object)

Solicita que o runtime da linguagem comum não chame o finalizador para o objeto especificado.

TryStartNoGCRegion(Int64, Boolean)

Tenta impedir a recolha de lixo durante a execução de um caminho crítico se houver uma quantidade especificada de memória disponível, e controla se o coletor de lixo realiza uma recolha de lixo bloqueante completa caso não haja memória suficiente inicialmente disponível.

TryStartNoGCRegion(Int64, Int64, Boolean)

Tenta impedir a recolha de lixo durante a execução de um caminho crítico se houver uma quantidade especificada de memória disponível para o monte de objetos grande e para o monte de objetos pequeno, e controla se o coletor de lixo faz uma recolha de lixo bloqueante completa se inicialmente não houver memória suficiente disponível.

TryStartNoGCRegion(Int64, Int64)

Tentativas de impedir a recolha de lixo durante a execução de um caminho crítico se houver uma quantidade especificada de memória disponível para o heap de objetos grande e para o heap de objetos pequeno.

TryStartNoGCRegion(Int64)

Tentativas de impedir a recolha de lixo durante a execução de um caminho crítico se houver uma quantidade especificada de memória disponível.

WaitForFullGCApproach()

Devolve o estado de uma notificação registada para determinar se uma recolha de lixo completa e bloqueante pelo runtime de linguagem comum é iminente.

WaitForFullGCApproach(Int32)

Devolve, num período de tempo limite especificado, o estado de uma notificação registada para determinar se uma recolha de lixo completa e bloqueante pelo runtime de linguagem comum é iminente.

WaitForFullGCApproach(TimeSpan)

Devolve, num período de tempo limite especificado, o estado de uma notificação registada para determinar se uma recolha de lixo completa e bloqueante pelo runtime de linguagem comum é iminente.

WaitForFullGCComplete()

Devolve o estado de uma notificação registada para determinar se uma recolha de lixo completa e bloqueante pelo runtime de linguagem comum foi concluída.

WaitForFullGCComplete(Int32)

Devolve, num período de tempo especificado, o estado de uma notificação registada para determinar se uma recolha de lixo completa, bloqueando por linguagem comum que o runtime foi concluída.

WaitForFullGCComplete(TimeSpan)

Devolve o estado de uma notificação registada sobre se a recolha de lixo bloqueada foi concluída. Posso esperar indefinidamente por uma coleção completa.

WaitForPendingFinalizers()

Suspende o thread atual até que o thread que está a processar a fila de finalizadores esvazie essa fila.

Aplica-se a

Ver também