Compreendendo a coleta de lixo (p1 / 2)

A coleta de lixo é uma característica fundamental das linguagens de programação modernas. Seu objetivo é fornecer uma maneira de gerenciar a memória. O que o GC faz é tentar liberar a memória ocupada por objetos que não serão mais usados.
O GC tentará encontrar esses objetos que não podem ser acessados ​​no futuro.

Cenário

GC Pro e Contras

A principal vantagem de usar GC é evitar lidar com a complexidade inata da desalocação de memória. Na verdade, a desalocação de memória pode nos levar a vários bugs e a um código mais complexo.
Por outro lado, a execução do GC não pode ser prevista, portanto é possível sofrer paralisações espalhadas ao longo da execução. Além disso, os programas de coleta de lixo demonstraram localidade de referência pobre, ou seja, em suma, que os programas de coleta de lixo usam mais endereços de memória.

Tipos de coletores de lixo

Principalmente, encontraremos duas categorias de GC:

+ Rastreamento de coletores de lixo

+ Coletores de contagem de referência

Rastreamento de coletores de lixo (TGC)

TGC estão relacionados ao conceito de alcançabilidade do objeto. Um objeto é alcançável, basicamente, quando o programa, em algum ponto da execução, pode levar a ele. Em qualquer linguagem baseada em pilha de chamadas (como Java), qualquer objeto na pilha é alcançável, além de variáveis ​​globais. Além disso, a acessibilidade de um objeto é transitiva, então os objetos referenciados em um objeto alcançável também são alcançáveis.

O TGC tentará liberar memória atribuída a objetos que não são alcançáveis.
Portanto, basicamente, os coletores de rastreamento iniciarão a execução do algoritmo de coleta de lixo em algum ponto (em Java, ele pode ser instado a ser executado), iterando sobre toda a pilha em busca de referências que possam ser recicladas. O algoritmo de coletor mais simples é uma marcação e varredura simples. Este algoritmo usa um bit para definir a acessibilidade do objeto. Quando a iteração da coleção começa, o conjunto raiz de objetos mais os objetos transitivamente acessíveis ao conjunto raiz são marcados como alcançáveis. Após a iteração, todos os objetos não marcados são candidatos à eliminação.
marcar e varrer claramente não é eficiente, devido à necessidade de interromper a execução em algum momento (não determinado). Pior ainda, será necessário analisar a pilha completa.
a marcação em três cores é um algoritmo de coletor de rastreamento mais eficiente. É baseado na ideia de atribuir uma cor a cada referência. Quando a tricolor inicia sua execução, todas as referências são brancas. Além disso, o cinza é atribuído ao conjunto raiz. Então, a ideia é simples: o algoritmo começa a verificar todas as referências conectadas aos tons de cinza, mudando qualquer referência de branco para cinza. Quando todas as referências transitivas de uma referência cinza são cinza, essa referência é alterada para preto. Quando finalmente não houver mais referências cinza, as referências brancas restantes não serão alcançáveis.

Coletores de contagem de referência (RCC)

RCC são baseados em uma ideia simples: cada objeto tem uma contagem do número de referências a ele. Quando o número de referências ao objeto é zero, então não é recuperável e candidato a ser coletado. A principal desvantagem do RCC são as referências mútuas. Nesse cenário, um objeto se refere a outro objeto, portanto, a contagem de referência nunca será zero para esse objeto. Essa situação pode levar a vazamentos de memória se houver muitas referências mútuas no tempo de execução.

Na parte 2, focarei no sistema Java Garbage Collection. Permaneça conectado!