首页 > 解决方案 > Erlang 引用是否被垃圾收集?

问题描述

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

标签: erlangerlang-supervisor

解决方案


您不会simple_one_for_one通过child_id(). 这些主管只有一个child_spec(),并且他们所有的孩子都使用相同的规范,这意味着child_id()规范中的 被忽略。孩子们被他们的 pid 引用。因此,该start_child/2函数不采用 a child_spec()(也不 a child_id()),只采用参数列表,并terminate_child/2采用pid()a 而不是 a child_id()。因此,您根本不必生成参考。

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

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

推荐阅读