Все проблемы в информатике могут быть решены с помощью другого уровня косвенности ... за исключением проблемы слишком большого количества уровней косвенности
Ваш подход не сразу решает проблему сбора мусора, а только перемещает ее на один уровень вверх. И какой ценой! Теперь каждый доступ к памяти проходит через разыменование другого указателя. Мы не можем кэшировать местоположение результата, потому что оно могло быть перемещено в это время, мы всегда должны проходить через идентификатор объекта. В большинстве систем это косвенное обращение недопустимо, и предполагается, что остановка мира будет иметь более низкие общие затраты времени выполнения.
Я сказал, что ваше предложение только перемещает проблему, но не решает ее. Проблема заключается в повторном использовании идентификаторов объектов. Идентификаторы объектов теперь являются нашими эквивалентами указателей, а количество адресов ограничено. Возможно (особенно в 32-битной системе), что за время жизни вашей программы будет создано больше объектов INT_MAX, например, в цикле, подобном
while (true) {
Object garbage = new Object();
}
Если мы просто увеличиваем ID объекта для каждого объекта, в какой-то момент у нас закончатся ID. Поэтому мы должны выяснить, какие идентификаторы все еще используются, а какие бесплатны, чтобы их можно было вернуть. Звучит знакомо? Теперь мы вернулись на круги своя.