Это кажется простым вопросом, но после долгих чтений на эту тему я так и не нашел однозначного ответа (возможно, потому, что это так просто).
У меня такой вопрос: когда сборщик мусора сжимает объекты в куче, как обновляются ссылки на эти объекты в стеке? Я могу придумать два возможных решения:
- Пройдите через стек (и ссылки в куче) и обновите ссылку, чтобы указать новое местоположение объекта. По аналогии с переездом это похоже на отправку письма всем, у кого есть ваш адрес, и просьбу обновить адресную книгу на ваш новый адрес.
- Обеспечить какую-то таблицу поиска. Это все равно, что оставить адрес пересылки в местном почтовом отделении.
Сборщики мусора преимущественно используют один из этих двух методов? Какой-то другой метод? И то и другое?
garbage-collection
todorojo
источник
источник
Ответы:
У меня нет конкретных знаний по этому вопросу, но я понимаю, что обычно используется первый метод.
Сборщик мусора должен в любом случае проанализировать стек, чтобы найти, какие вещи в куче упоминаются из стека. Как только он решает что-то переместить, ему все равно приходится исправлять ссылки на него, и нет никакой причины различать кучу и стек в этой точке.
Подход таблицы поиска в принципе может работать. Однако для этого все обращения к указателю должны быть выполнены в 2 этапа. Это будет иметь огромное влияние на производительность при нормальном времени выполнения. Особенно для случая использования многих мелких предметов. (Это тот случай, когда современные программы GC обычно бьют счетчик ссылок.)
источник