Вы не ссылаетесь на детей 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, сборщик мусора позаботится и о них.