Coleta de Lixo e Gerenciamento de Memória
O gerenciamento de memória governa como os programas alocam e recuperam memória; a coleta de lixo automatiza a recuperação identificando e liberando objetos que não são mais alcançáveis.
Definition
Gerenciamento de memória é a alocação e recuperação da memória de um programa; a coleta de lixo é a recuperação automática que libera a memória ocupada por objetos que o programa não pode mais alcançar, poupando o programador da desalocação explícita.
Scope
Este tópico abrange o gerenciamento automático e manual de memória para tempos de execução de linguagens: contagem de referências, marcação e varredura (mark-and-sweep), cópia e coleta geracional; rastreamento de alcançabilidade; e as compensações entre throughput, tempo de pausa e sobrecarga de memória. Aborda coletores concorrentes e incrementais e a relação entre a estratégia de coleta e o design da linguagem.
Core questions
- Como um coletor determina quais objetos ainda são necessários?
- Quais são as compensações entre throughput, latência e pegada de memória (memory footprint)?
- Por que separar objetos por idade (coleta geracional) melhora a eficiência?
- Como a coleta pode evitar longas pausas em sistemas interativos ou em tempo real?
Key theories
- Coleta de lixo por rastreamento (Tracing garbage collection)
- McCarthy introduziu a coleta de lixo automática para Lisp, estabelecendo a ideia de recuperar memória rastreando quais objetos permanecem alcançáveis a partir das raízes do programa.
- Coleta geracional
- Lieberman e Hewitt observaram que a maioria dos objetos morre jovem e propuseram coletar as gerações mais jovens com mais frequência, reduzindo drasticamente o custo da coleta na prática (a hipótese geracional).
- Taxonomia das técnicas de coleta
- Wilson e o Garbage Collection Handbook organizam o espaço de design de contagem de referências, marcação e varredura (mark-sweep), cópia, coletores incrementais e concorrentes e suas compensações de desempenho.
Clinical relevance
O gerenciamento automático de memória elimina classes inteiras de bugs, como ponteiros pendentes (dangling pointers) e vazamentos de memória (memory leaks), razão pela qual a maioria das linguagens de alto nível depende da coleta de lixo. A escolha do coletor afeta fortemente a latência e o throughput da aplicação, especialmente para sistemas interativos e de servidor.
History
McCarthy introduziu a coleta de lixo com Lisp em 1960. A coleta por cópia (Cheney) e a contagem de referências seguiram, e o coletor geracional de Lieberman e Hewitt de 1983 explorou os tempos de vida dos objetos. As décadas subsequentes produziram coletores incrementais, concorrentes e baseados em regiões, pesquisados de forma abrangente na obra de Wilson de 1992 e no Garbage Collection Handbook de 2011.
Debates
- Coleta automática versus gerenciamento manual ou baseado em propriedade (ownership-based management)
- Os designers debatem a coleta de lixo, que é segura e conveniente, mas pode impor pausas e sobrecarga, em contraste com o gerenciamento manual ou baseado em propriedade, que oferece desempenho previsível e menor pegada de memória (footprint) ao custo da carga e risco para o programador.
Key figures
- John McCarthy
- Henry Lieberman
- Carl Hewitt
- Richard Jones
- Paul Wilson
Related topics
Seminal works
- mccarthy1960
- lieberman1983
- wilson1992
- jones2011
Frequently asked questions
- Como um coletor de lixo sabe quais objetos liberar?
- Um coletor de rastreamento começa a partir de raízes conhecidas, como variáveis de pilha e globais, e segue referências para marcar todos os objetos alcançáveis; qualquer coisa não alcançada é inalcançável e pode ser recuperada.
- Por que a coleta de lixo geracional é eficaz?
- Como a maioria dos objetos se torna inalcançável logo após a alocação, coletar a geração jovem frequentemente recupera a maior parte do lixo de forma barata, enquanto objetos mais antigos e de longa duração são escaneados com muito menos frequência.