Как хранить ссылки в марке и подметать сборщик мусора? - PullRequest
1 голос
/ 03 апреля 2012

В последние выходные я начал писать свой собственный язык сценариев, как для обучения, так и для своего резюме, когда я закончу среднюю школу.Пока дела шли хорошо, я могу анализировать переменные с базовыми типами (null, boolean, number и string) и математическими выражениями с приоритетом оператора, а также иметь элементарную метку и очистить сборщик мусора (после завершения сбора метки / очистки)Я буду реализовывать сборщик мусора поколений, я знаю, что наивная метка / зачистка не очень быстрая).Я не уверен, как хранить ссылочные объекты для сборщика мусора, хотя.На данный момент у меня есть класс GCObject, который хранит указатель на его память и помечен он или нет.Должен ли я хранить связанный список с ссылочными объектами в классе?Я смотрел на сборщики мусора из других языков, но не вижу связанных списков ссылок для каждого объекта GCObject, поэтому меня это смущает.

TLDR: как хранить объекты, на которые ссылаются другие объекты, в метке и в циклеуборщик мусора?Я просто храню связанные списки объектов во всех моих объектах GCObject?

Спасибо, ребята.

1 Ответ

3 голосов
/ 03 апреля 2012

Как правило, вы не храните ссылки на объект ни в чем, кроме мест, в которых эти ссылки естественным образом встречаются. Во время операции пометки вам не нужно знать, какие ссылки указывают на объект; скорее вам нужно знать, какие ссылки содержит объект (или корень), чтобы вы могли рекурсивно пометить эти объекты.

Для фазы развертки вам также нужен способ перебора всех объектов, чтобы вы могли завершить работу со всеми объектами, на которые нет ссылок, и вернуть их хранилище в пул распределения. Как именно вы это сделаете, зависит от вашего общего распределителя - вы, вероятно, захотите написать собственный.

(я предполагаю, что вы не хотите делать уплотнение - это намного сложнее).

...