Noções básicas da coleta de lixoFundamentals of garbage collection

No Common Language Runtime (CLR), o coletor de lixo (GC) serve como um Gerenciador de memória automático.In the common language runtime (CLR), the garbage collector (GC) serves as an automatic memory manager. O coletor de lixo gerencia a alocação e o lançamento da memória para um aplicativo.The garbage collector manages the allocation and release of memory for an application. Para os desenvolvedores que trabalham com código gerenciado, isso significa que você não precisa escrever código para executar tarefas de gerenciamento de memória.For developers working with managed code, this means that you don't have to write code to perform memory management tasks. O gerenciamento automático de memória pode eliminar problemas comuns, como esquecer de liberar um objeto e causar um vazamento de memória ou tentar acessar a memória de um objeto que já foi liberado.Automatic memory management can eliminate common problems, such as forgetting to free an object and causing a memory leak or attempting to access memory for an object that's already been freed.

Este artigo descreve os principais conceitos da coleta de lixo.This article describes the core concepts of garbage collection.

BenefíciosBenefits

O coletor de lixo fornece os seguintes benefícios:The garbage collector provides the following benefits:

  • Libera os desenvolvedores de terem que liberar memória manualmente.Frees developers from having to manually release memory.

  • Aloca objetos no heap gerenciado com eficiência.Allocates objects on the managed heap efficiently.

  • Recupera os objetos que não estão sendo usados, limpa a memória e mantém a memória disponível para alocações futuras.Reclaims objects that are no longer being used, clears their memory, and keeps the memory available for future allocations. Os objetos gerenciados obtêm automaticamente conteúdo limpo para começar, de modo que seus construtores não precisam inicializar todos os campos de dados.Managed objects automatically get clean content to start with, so their constructors don't have to initialize every data field.

  • Fornece segurança de memória, assegurando que um objeto não possa usar o conteúdo de outro objeto.Provides memory safety by making sure that an object cannot use the content of another object.

Conceitos básicos de memóriaFundamentals of memory

A lista a seguir resume conceitos importantes de memória do CLR.The following list summarizes important CLR memory concepts.

  • Cada processo tem seu próprio espaço de endereço virtual separado.Each process has its own, separate virtual address space. Todos os processos no mesmo computador compartilham a mesma memória física e o arquivo de paginação, se houver um.All processes on the same computer share the same physical memory and the page file, if there is one.

  • Por padrão, em computadores de 32 bits, cada processo tem um espaço de endereço virtual no modo de usuário de 2 GB.By default, on 32-bit computers, each process has a 2-GB user-mode virtual address space.

  • Como desenvolvedor de aplicativos, você trabalha apenas com o espaço de endereço virtual e nunca manipula a memória física diretamente.As an application developer, you work only with virtual address space and never manipulate physical memory directly. O coletor de lixo aloca e libera memória virtual para você no heap gerenciado.The garbage collector allocates and frees virtual memory for you on the managed heap.

    Se você estiver escrevendo código nativo, use as funções do Windows para trabalhar com o espaço de endereço virtual.If you're writing native code, you use Windows functions to work with the virtual address space. Essas funções alocam e liberam memória virtual para você em heaps nativos.These functions allocate and free virtual memory for you on native heaps.

  • A memória virtual pode estar em três estados:Virtual memory can be in three states:

    EstadoState DescriçãoDescription
    GratuitaFree O bloco de memória não tem referências a ele e está disponível para alocação.The block of memory has no references to it and is available for allocation.
    ReservadoReserved O bloco de memória está disponível para seu uso e não pode ser usado para nenhuma outra solicitação de alocação.The block of memory is available for your use and cannot be used for any other allocation request. No entanto, você não pode armazenar dados nesse bloco de memória até que ele esteja comprometido.However, you cannot store data to this memory block until it is committed.
    ConfirmadoCommitted O bloco de memória é atribuído para armazenamento físico.The block of memory is assigned to physical storage.
  • O espaço de endereço virtual pode ficar fragmentado.Virtual address space can get fragmented. Isso significa que há blocos livres, também conhecido como furos, no espaço de endereço.This means that there are free blocks, also known as holes, in the address space. Quando uma alocação de memória virtual é solicitada, o gerenciador de memória virtual precisa localizar um único bloco livre suficientemente grande para atender a essa solicitação de alocação.When a virtual memory allocation is requested, the virtual memory manager has to find a single free block that is large enough to satisfy that allocation request. Mesmo que você tenha 2 GB de espaço livre, uma alocação que requer 2 GB não será bem-sucedida, a menos que todo o espaço livre esteja em um único bloco de endereço.Even if you have 2 GB of free space, an allocation that requires 2 GB will be unsuccessful unless all of that free space is in a single address block.

  • Você pode ficar sem memória se não houver espaço de endereço virtual suficiente para reservar ou espaço físico para confirmar.You can run out of memory if there isn't enough virtual address space to reserve or physical space to commit.

    O arquivo de paginação é usado mesmo se a pressão de memória física (ou seja, a demanda de memória física) estiver baixa.The page file is used even if physical memory pressure (that is, demand for physical memory) is low. Na primeira vez em que a pressão de memória física é alta, o sistema operacional deve liberar espaço na memória física para armazenar dados e faz backup de alguns dos dados que estão na memória física para o arquivo de paginação.The first time that physical memory pressure is high, the operating system must make room in physical memory to store data, and it backs up some of the data that is in physical memory to the page file. Esses dados não são paginados até que seja necessário, portanto, é possível encontrar paginação em situações em que a pressão da memória física está baixa.That data is not paged until it's needed, so it's possible to encounter paging in situations where the physical memory pressure is low.

Alocação de memóriaMemory allocation

Quando você inicializa um novo processo, o runtime reserva uma região contígua de espaço de endereço para o processo.When you initialize a new process, the runtime reserves a contiguous region of address space for the process. Esse espaço de endereço reservado é chamado de heap gerenciado.This reserved address space is called the managed heap. O heap gerenciado mantém um ponteiro para o endereço no qual o próximo objeto do heap será alocado.The managed heap maintains a pointer to the address where the next object in the heap will be allocated. Inicialmente, esse ponteiro é definido como o endereço básico do heap gerenciado.Initially, this pointer is set to the managed heap's base address. Todos os tipos de referência são alocados no heap gerenciado.All reference types are allocated on the managed heap. Quando um aplicativo cria o primeiro tipo de referência, a memória é alocada para o tipo no endereço base do heap gerenciado.When an application creates the first reference type, memory is allocated for the type at the base address of the managed heap. Quando o aplicativo cria o próximo objeto, o coletor de lixo aloca memória para ele no espaço de endereço logo depois do primeiro objeto.When the application creates the next object, the garbage collector allocates memory for it in the address space immediately following the first object. Desde que exista espaço de endereço disponível, o coletor de lixo continua alocando espaço para novos objetos dessa maneira.As long as address space is available, the garbage collector continues to allocate space for new objects in this manner.

A alocação memória com base no heap gerenciado é mais rápida do que a alocação de memória não gerenciada.Allocating memory from the managed heap is faster than unmanaged memory allocation. Como o tempo de execução aloca memória para um objeto adicionando um valor a um ponteiro, é quase tão rápido quanto alocar memória da pilha.Because the runtime allocates memory for an object by adding a value to a pointer, it's almost as fast as allocating memory from the stack. Além disso, como novos objetos alocados consecutivamente são armazenados de forma contígua no heap gerenciado, um aplicativo pode acessar os objetos rapidamente.In addition, because new objects that are allocated consecutively are stored contiguously in the managed heap, an application can access the objects quickly.

Liberação de memóriaMemory release

O mecanismo de otimização do coletor de lixo determina o melhor momento para executar uma coleta com base nas alocações que estão sendo feitas.The garbage collector's optimizing engine determines the best time to perform a collection based on the allocations being made. Quando o coletor de lixo executa uma coleta, ele libera a memória dos objetos que não estão mais sendo usados pelo aplicativo.When the garbage collector performs a collection, it releases the memory for objects that are no longer being used by the application. Ele determina quais objetos não estão mais sendo usados examinando as raízes do aplicativo.It determines which objects are no longer being used by examining the application's roots. As raízes de um aplicativo incluem campos estáticos, variáveis locais na pilha de um thread, registros de CPU, identificadores de GC e a fila de finalização.An application's roots include static fields, local variables on a thread's stack, CPU registers, GC handles, and the finalize queue. Cada raiz refere-se a um objeto no heap gerenciado ou é definida como nula.Each root either refers to an object on the managed heap or is set to null. O coletor de lixo pode pedir o restante do tempo de execução para essas raízes.The garbage collector can ask the rest of the runtime for these roots. Usando essa lista, o coletor de lixo cria um grafo que contém todos os objetos que podem ser acessados por meio das raízes.Using this list, the garbage collector creates a graph that contains all the objects that are reachable from the roots.

Objetos que não estão no gráfico são inacessíveis a partir das raízes do aplicativo.Objects that are not in the graph are unreachable from the application's roots. O coletor de lixo considera o lixo dos objetos inacessíveis e libera a memória alocada para eles.The garbage collector considers unreachable objects garbage and releases the memory allocated for them. Durante uma coleta, o coletor de lixo examina o heap gerenciado, procurando os blocos de espaço de endereço ocupados por objetos inacessíveis.During a collection, the garbage collector examines the managed heap, looking for the blocks of address space occupied by unreachable objects. Na medida em que descobre cada objeto inacessível, ele usa uma função de cópia de memória para compactar os objetos acessíveis na memória, liberando os blocos de espaços de endereço alocados para objetos inacessíveis.As it discovers each unreachable object, it uses a memory-copying function to compact the reachable objects in memory, freeing up the blocks of address spaces allocated to unreachable objects. Uma vez que a memória dos objetos acessíveis tenha sido compactada, o coletor de lixo faz as correções necessárias no ponteiro de forma que as raízes do aplicativo apontem para os objetos em seus novos locais.Once the memory for the reachable objects has been compacted, the garbage collector makes the necessary pointer corrections so that the application's roots point to the objects in their new locations. Ele também posiciona o ponteiro do heap gerenciado após o último objeto acessível.It also positions the managed heap's pointer after the last reachable object.

A memória é compactada somente se uma coleção descobre um número significativo de objetos inacessíveis.Memory is compacted only if a collection discovers a significant number of unreachable objects. Se todos os objetos no heap gerenciado sobrevivem a uma coleta, não há necessidade de compactação de memória.If all the objects in the managed heap survive a collection, then there is no need for memory compaction.

Para melhorar o desempenho, o runtime aloca memória para objetos grandes em um heap separado.To improve performance, the runtime allocates memory for large objects in a separate heap. O coletor de lixo automaticamente libera a memória para objetos grandes.The garbage collector automatically releases the memory for large objects. No entanto, para evitar a movimentação de objetos grandes na memória, essa memória geralmente não é compactada.However, to avoid moving large objects in memory, this memory is usually not compacted.

Condições para uma coleta de lixoConditions for a garbage collection

A coleta de lixo ocorre quando uma das seguintes condições é verdadeira:Garbage collection occurs when one of the following conditions is true:

  • O sistema tem pouca memória física.The system has low physical memory. Isso é detectado pela notificação de memória insuficiente do sistema operacional ou memória insuficiente, conforme indicado pelo host.This is detected by either the low memory notification from the OS or low memory as indicated by the host.

  • A memória usada por objetos alocados no heap gerenciado ultrapassa um limite aceitável.The memory that's used by allocated objects on the managed heap surpasses an acceptable threshold. Esse limite é ajustado continuamente enquanto o processo é executado.This threshold is continuously adjusted as the process runs.

  • O método GC.Collect é chamado.The GC.Collect method is called. Em quase todos os casos, você não precisa chamar esse método, pois o coletor de lixo é executado continuamente.In almost all cases, you don't have to call this method, because the garbage collector runs continuously. Esse método é usado principalmente para situações exclusivas e testes.This method is primarily used for unique situations and testing.

O heap gerenciadoThe managed heap

Depois que o coletor de lixo é inicializado pelo CLR, ele aloca um segmento da memória para armazenar e gerenciar objetos.After the garbage collector is initialized by the CLR, it allocates a segment of memory to store and manage objects. Essa memória é chamada de heap gerenciado, em contraposição a um heap nativo no sistema operacional.This memory is called the managed heap, as opposed to a native heap in the operating system.

Há um heap gerenciado para cada processo gerenciado.There is a managed heap for each managed process. Todos os threads no processo alocam memória para objetos no mesmo heap.All threads in the process allocate memory for objects on the same heap.

Para reservar memória, o coletor de lixo chama a função do Windows VirtualAlloc e reserva um segmento de memória por vez para aplicativos gerenciados.To reserve memory, the garbage collector calls the Windows VirtualAlloc function and reserves one segment of memory at a time for managed applications. O coletor de lixo também reserva segmentos, conforme necessário, e libera segmentos de volta para o sistema operacional (depois de limpá-los de qualquer objeto) chamando a função VirtualFree do Windows.The garbage collector also reserves segments, as needed, and releases segments back to the operating system (after clearing them of any objects) by calling the Windows VirtualFree function.

Importante

O tamanho de segmentos alocados pelo coletor de lixo é específico da implementação e está sujeito a alterações a qualquer momento, incluindo em atualizações periódicas.The size of segments allocated by the garbage collector is implementation-specific and is subject to change at any time, including in periodic updates. Seu aplicativo nunca deve fazer suposições sobre o tamanho de um segmento em particular nem depender dele, tampouco deve tentar configurar a quantidade de memória disponível para alocações de segmento.Your app should never make assumptions about or depend on a particular segment size, nor should it attempt to configure the amount of memory available for segment allocations.

Quanto menos objetos alocados no heap, menos trabalho o coletor de lixo precisa fazer.The fewer objects allocated on the heap, the less work the garbage collector has to do. Quando você aloca objetos, não usa valores arredondados que excedem suas necessidades, como alocar uma matriz de 32 bytes quando você precisa de apenas 15 bytes.When you allocate objects, don't use rounded-up values that exceed your needs, such as allocating an array of 32 bytes when you need only 15 bytes.

Quando uma coleta de lixo é disparada, o coletor de lixo recupera a memória ocupada por objetos mortos.When a garbage collection is triggered, the garbage collector reclaims the memory that's occupied by dead objects. O processo de recuperação compacta objetos vivos para que eles sejam movidos juntos e o espaço inativo é removido, tornando o heap menor.The reclaiming process compacts live objects so that they are moved together, and the dead space is removed, thereby making the heap smaller. Isso garante que os objetos alocados juntos permaneçam juntos no heap gerenciado para preservar sua localidade.This ensures that objects that are allocated together stay together on the managed heap to preserve their locality.

O grau de intrusão (frequência e a duração) de coletas de lixo é o resultado do volume de alocações e da quantidade de memória restante no heap gerenciado.The intrusiveness (frequency and duration) of garbage collections is the result of the volume of allocations and the amount of survived memory on the managed heap.

O heap pode ser considerado como o acúmulo de dois heaps: o heap de objetos grandes e o heap de objetos pequenos.The heap can be considered as the accumulation of two heaps: the large object heap and the small object heap. A heap de objeto grande contém objetos que são 85.000 bytes e maiores, que geralmente são matrizes.The large object heap contains objects that are 85,000 bytes and larger, which are usually arrays. É raro que um objeto de instância seja extremamente grande.It's rare for an instance object to be extremely large.

Dica

Você pode Configurar o tamanho do limite para objetos a serem acessados no heap de objeto grande.You can configure the threshold size for objects to go on the large object heap.

GeraçõesGenerations

O algoritmo GC se baseia em várias considerações:The GC algorithm is based on several considerations:

  • É mais rápido compactar a memória para uma parte do heap gerenciado do que para todo o heap gerenciado.It's faster to compact the memory for a portion of the managed heap than for the entire managed heap.
  • Os objetos mais recentes têm tempos de vida menores e objetos mais antigos têm tempos de vida mais longos.Newer objects have shorter lifetimes and older objects have longer lifetimes.
  • Os objetos mais recentes tendem a estar relacionados entre si e acessados pelo aplicativo ao mesmo tempo.Newer objects tend to be related to each other and accessed by the application around the same time.

A coleta de lixo ocorre principalmente com a recuperação de objetos de curta duração.Garbage collection primarily occurs with the reclamation of short-lived objects. Para otimizar o desempenho do coletor de lixo, o heap gerenciado é dividido em três gerações, 0, 1 e 2, para que possa manipular objetos de vida longa e de curta duração separadamente.To optimize the performance of the garbage collector, the managed heap is divided into three generations, 0, 1, and 2, so it can handle long-lived and short-lived objects separately. O coletor de lixo armazena novos objetos na geração 0.The garbage collector stores new objects in generation 0. Os objetos criados no início no tempo de vida do aplicativo que sobrevivem a coleções são promovidos e armazenados nas gerações 1 e 2.Objects created early in the application's lifetime that survive collections are promoted and stored in generations 1 and 2. Como é mais rápido compactar uma parte do heap gerenciado do que o heap inteiro, esse esquema permite que o coletor de lixo libere a memória em uma geração específica, em vez de liberar a memória para todo o heap gerenciado cada vez que executar uma coleção.Because it's faster to compact a portion of the managed heap than the entire heap, this scheme allows the garbage collector to release the memory in a specific generation rather than release the memory for the entire managed heap each time it performs a collection.

  • Geração 0.Generation 0. Essa é a geração mais jovem e contém objetos de vida útil curta.This is the youngest generation and contains short-lived objects. Um exemplo de um objeto de vida útil curta é uma variável temporária.An example of a short-lived object is a temporary variable. A coleta de lixo ocorre com mais frequência nessa geração.Garbage collection occurs most frequently in this generation.

    Os objetos alocados recentemente formam uma nova geração de objetos e são coleções de 0 geração implicitamente.Newly allocated objects form a new generation of objects and are implicitly generation 0 collections. No entanto, se forem objetos grandes, eles irão para o LOH (heap de objeto grande), que às vezes é chamado de geração 3.However, if they are large objects, they go on the large object heap (LOH), which is sometimes referred to as generation 3. A geração 3 é uma geração física que é coletada logicamente como parte da geração 2.Generation 3 is a physical generation that's logically collected as part of generation 2.

    A maioria dos objetos são recuperados para a coleta de lixo na geração 0 e não sobrevivem à próxima geração.Most objects are reclaimed for garbage collection in generation 0 and don't survive to the next generation.

    Se um aplicativo tentar criar um novo objeto quando a geração 0 estiver cheia, o coletor de lixo executará uma coleção em uma tentativa de liberar espaço de endereço para o objeto.If an application attempts to create a new object when generation 0 is full, the garbage collector performs a collection in an attempt to free address space for the object. O coletor de lixo inicia examinando os objetos na geração 0 em vez de todos os objetos no heap gerenciado.The garbage collector starts by examining the objects in generation 0 rather than all objects in the managed heap. Uma coleção da geração 0 geralmente recupera memória suficiente para permitir que o aplicativo continue criando novos objetos.A collection of generation 0 alone often reclaims enough memory to enable the application to continue creating new objects.

  • Geração 1.Generation 1. Essa geração contém objetos de vida útil curta e serve como um buffer entre objetos de vida útil curta e longa.This generation contains short-lived objects and serves as a buffer between short-lived objects and long-lived objects.

    Depois que o coletor de lixo executa uma coleção de geração 0, ele compacta a memória para os objetos acessíveis e promove-os para a geração 1.After the garbage collector performs a collection of generation 0, it compacts the memory for the reachable objects and promotes them to generation 1. Como os objetos que sobrevivem a coleções tendem a ter tempos de vida mais longos, faz sentido promovê-los a uma geração mais alta.Because objects that survive collections tend to have longer lifetimes, it makes sense to promote them to a higher generation. O coletor de lixo não precisa examinar novamente os objetos nas gerações 1 e 2 cada vez que executa uma coleção de geração 0.The garbage collector doesn't have to reexamine the objects in generations 1 and 2 each time it performs a collection of generation 0.

    Se uma coleção de geração 0 não recuperar memória suficiente para que o aplicativo crie um novo objeto, o coletor de lixo poderá executar uma coleção de geração 1 e, em seguida, a geração 2.If a collection of generation 0 does not reclaim enough memory for the application to create a new object, the garbage collector can perform a collection of generation 1, then generation 2. Os objetos na geração 1 que sobrevivem a coleções são promovidos para a geração 2.Objects in generation 1 that survive collections are promoted to generation 2.

  • Geração 2.Generation 2. Essa geração contém objetos de vida útil longa.This generation contains long-lived objects. Um exemplo de um objeto de vida longa é um objeto em um aplicativo de servidor que contém dados estáticos que residem durante o processo.An example of a long-lived object is an object in a server application that contains static data that's live for the duration of the process.

    Os objetos na geração 2 que sobrevivem a uma coleção permanecem na geração 2 até que sejam determinados como inacessíveis em uma coleção futura.Objects in generation 2 that survive a collection remain in generation 2 until they are determined to be unreachable in a future collection.

    Objetos na heap de objeto grande (que às vezes é chamado de geração 3) também são coletados na geração 2.Objects on the large object heap (which is sometimes referred to as generation 3) are also collected in generation 2.

Coletas de lixo ocorrem em gerações específicas conforme as condições permitirem.Garbage collections occur on specific generations as conditions warrant. Coletar uma geração significa coletar objetos nessa geração e todas as suas gerações mais jovens.Collecting a generation means collecting objects in that generation and all its younger generations. Uma coleta de lixo de geração 2 também é conhecida como uma coleta de lixo completa, porque recupera objetos em todas as gerações (ou seja, todos os objetos no heap gerenciado).A generation 2 garbage collection is also known as a full garbage collection, because it reclaims objects in all generations (that is, all objects in the managed heap).

Sobrevivência e promoçõesSurvival and promotions

Os objetos que não são recuperados em uma coleta de lixo são conhecidos como os sobreviventes e são promovidos para a próxima geração:Objects that are not reclaimed in a garbage collection are known as survivors and are promoted to the next generation:

  • Os objetos que sobrevivem a uma coleta de lixo de geração 0 são promovidos para a geração 1.Objects that survive a generation 0 garbage collection are promoted to generation 1.
  • Os objetos que sobrevivem a uma coleta de lixo de geração 1 são promovidos para a geração 2.Objects that survive a generation 1 garbage collection are promoted to generation 2.
  • Os objetos que sobrevivem a uma coleta de lixo de geração 2 permanecem na geração 2.Objects that survive a generation 2 garbage collection remain in generation 2.

Quando o coletor de lixo detecta que a taxa de sobrevivência é alta em uma geração, ela aumenta o limite de alocações para essa geração.When the garbage collector detects that the survival rate is high in a generation, it increases the threshold of allocations for that generation. A próxima coleção Obtém um tamanho substancial de memória recuperada.The next collection gets a substantial size of reclaimed memory. O CLR balanceia continuamente duas prioridades: não permitir que o conjunto de trabalho de um aplicativo fique muito grande atrasando a coleta de lixo e não permitindo que a coleta de lixo seja executada com muita frequência.The CLR continually balances two priorities: not letting an application's working set get too large by delaying garbage collection and not letting the garbage collection run too frequently.

Gerações e segmentos efêmerosEphemeral generations and segments

Como os objetos nas gerações 0 e 1 são de curta duração, essas gerações são conhecidas como as gerações efêmeras.Because objects in generations 0 and 1 are short-lived, these generations are known as the ephemeral generations.

As gerações efêmeras são alocadas no segmento de memória que é conhecido como o segmento efêmero.Ephemeral generations are allocated in the memory segment that's known as the ephemeral segment. Cada novo segmento adquirido pelo coletor de lixo torna-se o novo segmento efêmero e contém os objetos que sobreviveram a uma coleta de lixo da geração 0.Each new segment acquired by the garbage collector becomes the new ephemeral segment and contains the objects that survived a generation 0 garbage collection. O segmento efêmero antigo torna-se o novo segmento da geração 2.The old ephemeral segment becomes the new generation 2 segment.

O tamanho do segmento efêmero varia dependendo se um sistema for de 32 bits ou 64 bits e no tipo de coletor de lixo em execução (estação de trabalho ou servidor GC).The size of the ephemeral segment varies depending on whether a system is 32-bit or 64-bit and on the type of garbage collector it is running (workstation or server GC). A tabela a seguir mostra os tamanhos padrão do segmento efêmero.The following table shows the default sizes of the ephemeral segment.

Estação de trabalho/servidor GCWorkstation/server GC 32 bits32-bit 64 bits64-bit
GC da estação de trabalhoWorkstation GC 16 MB16 MB 256 MB256 MB
GC do servidorServer GC 64 MB64 MB 4 GB4 GB
GC do Servidor com > 4 CPUs lógicasServer GC with > 4 logical CPUs 32 MB32 MB 2 GB2 GB
GC do Servidor com > 8 CPUs lógicasServer GC with > 8 logical CPUs 16 MB16 MB 1 GB1 GB

O segmento efêmero pode incluir objetos da geração 2.The ephemeral segment can include generation 2 objects. Objetos da geração 2 podem usar vários segmentos (tantos quanto exigido pelo seu processo e permitido pela memória).Generation 2 objects can use multiple segments (as many as your process requires and memory allows for).

A quantidade de memória liberada de uma coleta de lixo efêmera é limitada ao tamanho do segmento efêmero.The amount of freed memory from an ephemeral garbage collection is limited to the size of the ephemeral segment. A quantidade de memória liberada é proporcional ao espaço que era ocupado pelos objetos inativos.The amount of memory that is freed is proportional to the space that was occupied by the dead objects.

O que ocorre durante uma coleta de lixoWhat happens during a garbage collection

Uma coleta de lixo tem as seguintes fases:A garbage collection has the following phases:

  • Uma fase de marcação que localiza todos os objetos vivos e cria uma lista desses objetos.A marking phase that finds and creates a list of all live objects.

  • Uma fase de relocação que atualiza as referências aos objetos que serão compactados.A relocating phase that updates the references to the objects that will be compacted.

  • Uma fase de compactação que recupera o espaço ocupado por objetos inativos e compacta os objetos sobreviventes.A compacting phase that reclaims the space occupied by the dead objects and compacts the surviving objects. A fase de compactação move objetos que sobreviveram a uma coleta de lixo em direção à extremidade mais antiga do segmento.The compacting phase moves objects that have survived a garbage collection toward the older end of the segment.

    Em virtude das coletas da geração 2 poderem ocupar vários segmentos, objetos que são promovidos para a geração 2 podem ser movidos para um segmento mais antigo.Because generation 2 collections can occupy multiple segments, objects that are promoted into generation 2 can be moved into an older segment. Tanto os sobreviventes da geração 1 quanto da geração 2 podem ser movidos para um segmento diferente, porque eles são promovidos para a geração 2.Both generation 1 and generation 2 survivors can be moved to a different segment, because they are promoted to generation 2.

    Normalmente, o LOH (heap de objeto grande) não é compactado, pois copiar objetos grandes impõe uma penalidade de desempenho.Ordinarily, the large object heap (LOH) is not compacted, because copying large objects imposes a performance penalty. No entanto, no .NET Core e no .NET Framework 4.5.1 e posterior, você pode usar a GCSettings.LargeObjectHeapCompactionMode propriedade para compactar o heap de objeto grande sob demanda.However, in .NET Core and in .NET Framework 4.5.1 and later, you can use the GCSettings.LargeObjectHeapCompactionMode property to compact the large object heap on demand. Além disso, o LOH é compactado automaticamente quando um limite rígido é definido especificando:In addition, the LOH is automatically compacted when a hard limit is set by specifying either:

O coletor de lixo usa as informações a seguir para determinar se os objetos estão vivos:The garbage collector uses the following information to determine whether objects are live:

  • Raízes da pilha.Stack roots. Variáveis de pilha fornecidas pelo compilador JIT (just-in-time) e movimentador de pilhas.Stack variables provided by the just-in-time (JIT) compiler and stack walker. As otimizações JIT podem aumentar ou diminuir as regiões do código dentro das quais as variáveis de pilha são relatadas ao coletor de lixo.JIT optimizations can lengthen or shorten regions of code within which stack variables are reported to the garbage collector.

  • Identificadores de coleta de lixo.Garbage collection handles. Identificadores que apontam para objetos gerenciados e que podem ser alocados pelo código do usuário ou pelo Common Language Runtime.Handles that point to managed objects and that can be allocated by user code or by the common language runtime.

  • Dados estáticos.Static data. Objetos estáticos em domínios de aplicativo que podem fazer referência a outros objetos.Static objects in application domains that could be referencing other objects. Cada domínio de aplicativo controla seus objetos estáticos.Each application domain keeps track of its static objects.

Antes de iniciar uma coleta de lixo, todos os threads gerenciados são suspensos, exceto o thread que disparou a coleta de lixo.Before a garbage collection starts, all managed threads are suspended except for the thread that triggered the garbage collection.

A ilustração a seguir mostra um thread que dispara uma coleta de lixo e faz com que outros threads sejam suspensos.The following illustration shows a thread that triggers a garbage collection and causes the other threads to be suspended.

Quando um thread dispara uma coleta de lixo

Recursos não gerenciadosUnmanaged resources

Para a maioria dos objetos que seu aplicativo cria, você pode confiar na coleta de lixo para executar automaticamente as tarefas de gerenciamento de memória necessárias.For most of the objects that your application creates, you can rely on garbage collection to automatically perform the necessary memory management tasks. Entretanto, recursos não gerenciados requerem limpeza explícita.However, unmanaged resources require explicit cleanup. O tipo mais comum de recursos não gerenciados é um objeto que encapsula um recurso do sistema operacional, como um identificador de arquivo, um identificador de janela ou uma conexão de rede.The most common type of unmanaged resource is an object that wraps an operating system resource, such as a file handle, window handle, or network connection. Embora o coletor de lixo possa controlar o tempo de vida de um objeto gerenciado que encapsula um recurso não gerenciado, ele não tem conhecimento específico sobre como limpar o recurso.Although the garbage collector is able to track the lifetime of a managed object that encapsulates an unmanaged resource, it doesn't have specific knowledge about how to clean up the resource.

Quando você cria um objeto que encapsula um recurso não gerenciado, é recomendável que você forneça o código necessário para limpar o recurso não gerenciado em um Dispose método público.When you create an object that encapsulates an unmanaged resource, it's recommended that you provide the necessary code to clean up the unmanaged resource in a public Dispose method. Ao fornecer um método Dispose, você permite que usuários do seu objeto liberem, explicitamente, sua memória quando terminarem o objeto.By providing a Dispose method, you enable users of your object to explicitly free its memory when they are finished with the object. Ao usar um objeto que encapsula um recurso não gerenciado, certifique-se de chamar Dispose conforme necessário.When you use an object that encapsulates an unmanaged resource, make sure to call Dispose as necessary.

Você também deve fornecer uma maneira para que seus recursos não gerenciados sejam liberados caso um consumidor de seu tipo se esqueça de chamar Dispose .You must also provide a way for your unmanaged resources to be released in case a consumer of your type forgets to call Dispose. Você pode usar um identificador seguro para encapsular o recurso não gerenciado ou substituir o Object.Finalize() método.You can either use a safe handle to wrap the unmanaged resource, or override the Object.Finalize() method.

Para obter mais informações sobre como limpar recursos não gerenciados, consulte limpar recursos não gerenciados.For more information about cleaning up unmanaged resources, see Clean up unmanaged resources.

Confira tambémSee also