Todos os problemas em ciência da computação podem ser resolvidos por outro nível de indireção ... exceto pelo problema de muitas camadas de indireção
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
while (true) {
Object garbage = new Object();
}
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.