【问题标题】:Are Erlang references garbage collected?Erlang 引用是否被垃圾收集?
【发布时间】:2020-02-11 11:02:53
【问题描述】:

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

【问题讨论】:

  • 为什么不使用 PID?
  • 好吧,我会用pid。

标签: erlang erlang-supervisor


【解决方案1】:

您不能通过 child_id() 引用 simple_one_for_one 主管的子级。这些主管只有一个child_spec(),并且他们所有的孩子都使用相同的规范,这意味着规范中的child_id() 被忽略。孩子们被他们的 pid 引用。所以start_child/2 函数不需要child_spec()(也不是child_id()),只有一个参数列表,terminate_child/2 需要pid() 而不是child_id()。所以你根本不需要生成引用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2018-08-15
    • 2017-02-21
    相关资源
    最近更新 更多