Обновление ссылок - не единственное, что требует паузы. Все стандартные алгоритмы, обычно сгруппированные в «mark-sweep», предполагают, что весь граф объекта остается неизменным, пока он помечен. Для правильной обработки изменений (новые объекты созданы, ссылки изменены) требуются довольно сложные альтернативные алгоритмы, такие как трехцветный алгоритм. Общий термин «параллельная сборка мусора».
Но да, обновление ссылок после сжатия также требует паузы. И да, использование косвенного обращения (например, с помощью постоянного идентификатора объекта и хеш-таблицы к реальным указателям) может значительно уменьшить количество пауз. Может быть даже возможно сделать эту часть без блокировки, если кто-то этого желает. Было бы так же сложно получить право, как и любой параллельный параллельный доступ к общей памяти, но нет фундаментальной причины, по которой это не сработало бы.
Однако это будет иметь серьезные недостатки. Помимо того, что занимает дополнительное место ( как минимум два лишних слова для всех объектов), это делает каждую разыменование намного дороже. Даже такая простая вещь, как получение атрибута, теперь включает в себя полный поиск по хеш-таблице. Я бы оценил снижение производительности как гораздо худшее, чем при инкрементной трассировке.
Ваш подход не сразу решает проблему сбора мусора, а только перемещает ее на один уровень вверх. И какой ценой! Теперь каждый доступ к памяти проходит через разыменование другого указателя. Мы не можем кэшировать местоположение результата, потому что оно могло быть перемещено в это время, мы всегда должны проходить через идентификатор объекта. В большинстве систем это косвенное обращение недопустимо, и предполагается, что остановка мира будет иметь более низкие общие затраты времени выполнения.
Я сказал, что ваше предложение только перемещает проблему, но не решает ее. Проблема заключается в повторном использовании идентификаторов объектов. Идентификаторы объектов теперь являются нашими эквивалентами указателей, а количество адресов ограничено. Возможно (особенно в 32-битной системе), что за время жизни вашей программы будет создано больше объектов INT_MAX, например, в цикле, подобном
Если мы просто увеличиваем ID объекта для каждого объекта, в какой-то момент у нас закончатся ID. Поэтому мы должны выяснить, какие идентификаторы все еще используются, а какие бесплатны, чтобы их можно было вернуть. Звучит знакомо? Теперь мы вернулись на круги своя.
источник
В вашей мысли нет ошибки, вы только что описали нечто очень близкое к тому, как работал оригинальный сборщик мусора Java
Так что это работает, это было опробовано, и его неэффективность привела к разработке систем меток и разверток поколений.
источник
Object.getHashCode()