Atualizar referências não é a única coisa que requer uma pausa. Os algoritmos padrão geralmente agrupados em "varredura de marca" assumem que todo o gráfico de objetos permanece inalterado enquanto está sendo marcado. O manuseio correto de modificações (novos objetos criados, referências alteradas) requer algoritmos alternativos bastante complicados, como o algoritmo tricolor. O termo geral é "coleta de lixo simultânea".
Mas sim, a atualização de referências após a compactação também precisa de uma pausa. E sim, o uso da indireção (por exemplo, através de um ID de objeto persistente e uma tabela de hash para ponteiros reais) pode reduzir bastante a pausa. Pode até ser possível tornar essa peça livre de bloqueios, se assim o desejar. Ainda seria tão complicado acertar quanto qualquer concorrência de memória compartilhada de baixo nível, mas não há razão fundamental para que isso não funcione.
No entanto , isso teria sérias desvantagens. Além de ocupar espaço extra ( pelo menos duas palavras extras para todos os objetos), torna cada desreferência muito mais cara. Mesmo algo tão simples como obter um atributo agora envolve uma pesquisa completa da tabela de hash. Eu estimaria o desempenho atingido como muito pior do que para rastreamento incremental.
Sua abordagem não resolve imediatamente o problema da coleta de lixo, mas apenas a eleva um nível. E a que custo! Agora, todo acesso à memória passa por outra desreferência de ponteiro. Não podemos armazenar em cache o local do resultado, pois, embora possa ter sido realocado, sempre devemos passar pelo ID do objeto. Na maioria dos sistemas, esse indireto não é aceitável e presume-se que parar o mundo tenha um custo total de tempo de execução mais baixo.
Eu disse que sua proposta apenas move o problema, não o resolve. O problema está relacionado à reutilização de IDs de objetos. Os IDs de objetos agora são equivalentes a ponteiros e há apenas uma quantidade finita de endereços. É concebível (especialmente em um sistema de 32 bits) que durante a vida útil do seu programa, mais de objetos INT_MAX tenham sido criados, por exemplo, em um loop como
Se apenas incrementarmos o ID do objeto para cada objeto, ficaremos sem IDs em algum momento. Portanto, temos que descobrir quais IDs ainda estão em uso e quais são gratuitos para que possam ser recuperados. Soa familiar? Agora estamos de volta à estaca zero.
fonte
Não há nenhum erro na sua linha de pensamento, você acabou de descrever algo muito próximo de como o coletor de lixo Java original funcionava
Portanto, ele funciona, foi tentado e sua ineficiência levou ao desenvolvimento de sistemas geradores de marca e varredura.
fonte
Object.getHashCode()