是否收集了Erlang引用垃圾?

jsl*_*oop 2 erlang erlang-supervisor

我想动态地将孩子添加到simple_one_for_one主管中。为此,我正在考虑使用make_ref()ref 创建子标识符并将其保存在地图中。孩子终止后,该参考将从地图中删除。在这种情况下,将通过垃圾收集引用吗?

Dán*_*lay 5

您不会simple_one_for_one通过来引用主管的子女child_id()。这些主管只有一个child_spec(),并且他们的所有子级都使用相同的规范,这意味着child_id()该规范中的会被忽略。这些子项将由其pid引用。因此该start_child/2函数不带child_spec()(也不带child_id()),仅带参数列表,而terminate_child/2pid()而不是child_id()。因此,您根本不需要生成引用。

但是,要回答您的问题:是的,引用是垃圾收集的。所有Erlang数据类型都是垃圾回收。如果您确实想深入研究细节,则有一些警告,但没有什么可真正担心的:

  • 所有原子都添加到原子表中,该表不进行垃圾收集。这意味着原子是从进程的堆栈和堆中收集的垃圾,但是即使您从每个进程和每个ETS表中删除对一个特定原子的所有引用,它仍将保留在原子表中。
  • 二进制文件是垃圾收集的,但是它们在进程之间共享。因此,仅在二进制文件不再在任何进程中使用后,才会回收用于存储二进制文件的内存。
  • 编写NIF(本地实现的函数,用C编写)时,您会看到VM将某些类型分配为引用计数的对象。NIF的职责是维护这些对象的引用计数器,但是一旦将它们移交给Erlang代码,垃圾收集器也将处理它们。