Ссылки 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, сборщик мусора позаботится и о них.
Другие вопросы по тегам