Coletor de lixo (informática)
# Coletor de lixo (informática)

Coletor de lixo (em inglês: garbage collector, ou o acrônimo GC) é um processo usado para a automação do gerenciamento de memória. Com ele é possível recuperar uma área de memória inutilizada por um programa, o que pode evitar problemas de vazamento de memória, resultando no esgotamento da memória livre para alocação.
Esse sistema contrasta com o gerenciamento manual de memória, em que o programador deve especificar explicitamente quando e quais objetos devem ser desalocados e retornados ao sistema. Entretanto, muitos sistemas usam uma combinação das duas abordagens.
Foi inventado por John McCarthy por volta de 1959 para resolver problemas de gerenciamento manual de memória em Lisp.

## Descrição

Os princípios básicos do coletor de lixo são encontrar objetos de um programa que não serão mais acessados no futuro, e desalocar os recursos utilizados por tais objetos. Tornando a desalocação manual de memória desnecessária, e geralmente proibindo tal prática, o coletor de lixo livra o programador de se preocupar com a liberação de recursos já não utilizados, o que pode consumir uma parte significativa do desenvolvimento do software. Também evita que o programador introduza erros no programa devido a má utilização de ponteiros.

### Vantagens

O coletor de lixo livra o programador de lidar manualmente com o gerenciamento de memória. Como resultado, certas categorias e defeitos de software são eliminadas ou reduzidas. Um dos problemas se refere ao apontador pendente, que ocorre quando um pedaço de memória é desalocado enquanto ainda há ponteiros apontando para o objeto, e um desses ponteiros é usado. Outro problema é liberar uma região de memória mais de uma vez. Também há certos tipos de vazamento de memória, em que o programa deixa de desalocar memória já não usada de forma a chegar num ponto de esgotamento de memória.
Há uma distinção entre vazamentos físicos e lógicos de memória. No vazamento físico, o último ponteiro para uma região de memória alocada é removido, mas a memória não é desalocada. No vazamento lógico, uma região de memória ainda é referenciada por um ponteiro, mas nunca será usada. Coletores de lixo não conseguem reduzir o risco de vazamentos lógicos, somente físicos.
Em linguagens que provem alocação dinâmica, o coletor de lixo é essencial para a segurança de memória e está geralmente associado à propriedade de segurança de tipo.
Em linguagens orientadas a objetos onde o tempo de carga do objeto é muito alta o coletor pode conter um algoritmo para cache de objetos de forma a devolver objetos que costumam ser utilizados com frequência sem precisar recriá-los.

### Desvantagens

Coletores de lixo também possuem suas desvantagens. Eles são processos que consomem recursos computacionais para decidir quais partes da memória podem ser liberadas, enquanto no gerenciamento manual esse consumo é mínimo. Outro ponto negativo é que o momento em que o objeto é realmente desalocado não é determinístico, o que pode acarretar na variação do tempo de execução de algoritmo em partes aleatórias, o que impensável em sistemas como em tempo real, drivers de dispositivo e processamento de transações. Também, o uso de recursividade atrasa a desalocação automática da memória da pilha de execução até que a última chamada seja completada, aumentando os requisitos de memória do algoritmo. Por fim, a detecção semântica de objetos a serem desalocados é um problema indecidível para qualquer processo automático, devido ao problema da parada.

## Uso prático

Diversas linguagens de computador exigem o coletor de lixo, seja como parte da especificação da linguagem (como em Java e C#) ou na implementação (como em linguagens formais tais quais cálculo lambda). Outras linguagens foram desenvolvidas para suportar somente o gerenciamento manual de memória, mas possuem implementações de coletor de lixo disponíveis, como C++.
Para algumas linguagens, há suporte para o gerenciamento manual ou automático de memória ao utilizar diferentes memórias heap para os objetos manuais ou automáticos, como em Ada. Já D permite o coletor de lixo mas também a desalocação manual e desabilitar completamente o coletor.