Собираются ли ссылки на Erlang? - PullRequest
2 голосов
/ 14 октября 2019

Я хочу динамически добавлять детей к simple_one_for_one супервизору. Для этого я думаю о создании дочернего идентификатора с использованием make_ref() и сохранении ссылки на карте. Как только ребенок заканчивается, ссылка будет удалена с карты. В этом случае будет ли ссылка на сборщик мусора?

1 Ответ

5 голосов
/ 18 октября 2019

Вы не ссылаетесь на детей simple_one_for_one супервизоров через child_id(). У этих супервизоров ровно один child_spec(), и все их дети используют ту же спецификацию, что означает, что child_id() в спецификации игнорируется. На детей вместо этого ссылается их pid. Таким образом, функция start_child/2 не принимает child_spec() (ни child_id()), а только список аргументов, а terminate_child/2 принимает pid() вместо child_id(). Так что вам вообще не нужно генерировать ссылки.

Но, чтобы ответить на ваш вопрос: да, ссылки собирают мусор. Все типы данных Erlang являются сборщиком мусора. Есть несколько предостережений, если вы действительно хотите углубиться в детали, но не о чем беспокоиться:

  • Все атомы добавляются в таблицу атомов, которая не является сборщиком мусора. Это означает, что атомы отбираются из стека и кучи процесса, но даже если вы удалите все ссылки на один определенный атом из каждого процесса и каждой таблицы ETS, он все равно останется в таблице атомов.
  • Двоичные файлысборка мусора, но они распределяются между процессами. Поэтому память, используемая для хранения двоичного файла, освобождается только после того, как двоичный файл больше не используется ни в одном из процессов.
  • При написании NIF-ов (встроенных функций, написанных на C) вы увидите, что определенные типыраспределяются как объекты с подсчетом ссылок виртуальной машиной. NIF обязан поддерживать счетчики ссылок для этих объектов, но как только они будут переданы в код Erlang, сборщик мусора позаботится и о них.
...