gpt4 book ai didi

erlang - Erlang 引用是否被垃圾收集?

转载 作者:行者123 更新时间:2023-12-02 08:00:09 24 4
gpt4 key购买 nike

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

最佳答案

您不能通过 child_id() 引用 simple_one_for_one 主管的 child 。这些监管者只有一个 child_spec(),他们的所有 child 都使用相同的规范,这意味着规范中的 child_id() 被忽略。 children 改为由他们的 pid 引用。所以 start_child/2 函数不接受 child_spec()(也不接受 child_id()),只有一个参数列表,并且 terminate_child/2 采用 pid() 而不是 child_id()。所以您根本不必生成引用。

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

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

关于erlang - Erlang 引用是否被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58383248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com