Parece uma pergunta simples, mas depois de muita leitura sobre o assunto, ainda não encontrei uma resposta definitiva (talvez por ser tão simples).
Minha pergunta é a seguinte: quando um coletor de lixo compacta objetos na pilha, como as referências a esses objetos na pilha são atualizadas? Eu posso pensar em duas soluções possíveis:
- Percorra a pilha (e as referências na pilha) e atualize a referência para apontar para o novo local do objeto. Em uma analogia à mudança, seria como enviar uma carta para qualquer pessoa que possua seu endereço e pedir que atualizem o catálogo de endereços com o seu novo endereço.
- Forneça algum tipo de tabela de consulta. Seria como deixar um endereço de encaminhamento na estação de correios local.
Os coletores de lixo usam predominantemente um desses dois métodos? Algum outro método? Ambos?
garbage-collection
todorojo
fonte
fonte
Respostas:
Não tenho conhecimentos específicos sobre isso, mas meu entendimento é que o primeiro método é geralmente usado.
O coletor de lixo precisa analisar a pilha de qualquer maneira para descobrir a que coisas na pilha são referidas na pilha. Depois que decide mover algo, ele precisa corrigir as referências a ele de qualquer maneira, e não há motivo para diferenciar entre heap e stack nesse ponto.
A abordagem da tabela de pesquisa em princípio poderia funcionar. No entanto, isso faria com que todos os acessos a ponteiros precisassem executar 2 etapas. Isso seria um enorme impacto no desempenho em tempos de execução normais. Especialmente para o caso de uso de muitos objetos pequenos. (Esse é um caso em que os programas de GC de última geração geralmente superam a contagem de referência.)
fonte