Я реализовал Java-сборщик мусора один раз, поэтому все, что мне удалось сделать, - это (слабая :) нижняя граница того, что возможно.
В моей реализации есть небольшое постоянное количество дополнительных издержек для каждой слабой ссылки, когда она посещается во время сборки мусора.
В итоге: я бы не волновался об этом, это не большая проблема, если вы не используете миллионы слабых ссылок.
Самое главное, стоимость пропорциональна количеству существующих слабых ссылок, а не размеру общей кучи.
Однако это не означает, что сборщик мусора, который поддерживает слабые ссылки, будет работать так же быстро, как и тот, который не поддерживает. Предполагаемый вопрос здесь, учитывая, что Java поддерживает слабые ссылки, какова дополнительная стоимость их использования?
Шахта была простой меткой "останови мир" / выметала мусорщик. Во время сборки мусора он определяет для каждого объекта, является ли этот объект живым или нет, и устанавливает бит LIVE
в заголовке объекта. Затем он проходит и освобождает все неживые объекты.
Для обработки слабых ссылок вы просто добавляете следующее:
- Игнорировать слабые ссылки при установке битов
LIVE
(т. Е. Они не приводят к установке бита LIVE
на ссылочный объект).
- На этапе развертки добавьте специальную проверку следующим образом: если объект, который вы посещаете, равен
LIVE
, и это WeakReference
, то проверьте объект, на который он слабо ссылается, и если этот объект не LIVE
, очистить ссылку.
Небольшие вариации этой логики работают для мягких и фантомных ссылок.
Реализация здесь , если вам действительно любопытно.