是否会收集Erlang引用垃圾?

时间:2019-10-14 19:53:15

标签: erlang erlang-supervisor

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

1 个答案:

答案 0 :(得分:5)

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

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

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