Ссылки Erlang собираются мусором?
Я хочу динамически добавлять детей в simple_one_for_one
руководитель. Для этого я думаю о создании дочернего идентификатора, используяmake_ref()
и сохраните ссылку на карте. Как только дочерний элемент завершится, ссылка будет удалена с карты. В этом случае будет ли ссылка собрана мусором?
1 ответ
Вы не ссылаетесь на детей 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, сборщик мусора позаботится и о них.