Erlang引用是否被垃圾收集?

Erlang引用是否被垃圾收集?,erlang,erlang-supervisor,Erlang,Erlang Supervisor,我想动态地将子对象添加到一个simple\u one\u for\u onesupervisor。为此,我考虑使用make_ref()创建一个子标识符,并将ref保存在一个映射中。一旦子对象终止,ref将从映射中删除。在这种情况下,垃圾是否会收集引用?您不能通过子\u id()引用simple\u-for\u-one主管的子级。这些监管者只有一个child\u spec(),并且他们的所有子监管者都使用相同的规范,这意味着规范中的child\u id()将被忽略。子对象由其pid引用。因此sta

我想动态地将子对象添加到一个
simple\u one\u for\u one
supervisor。为此,我考虑使用
make_ref()
创建一个子标识符,并将ref保存在一个映射中。一旦子对象终止,ref将从映射中删除。在这种情况下,垃圾是否会收集引用?

您不能通过
子\u id()
引用
simple\u-for\u-one
主管的子级。这些监管者只有一个
child\u spec()
,并且他们的所有子监管者都使用相同的规范,这意味着规范中的
child\u id()
将被忽略。子对象由其pid引用。因此
start\u child/2
函数不接受
child\u spec()
(也不接受
child\u id()
),只接受一个参数列表,
terminate\u child/2
接受
pid()
而不是
child\u id()
。因此,您根本不必生成引用

但是,为了回答您的问题:是的,引用是垃圾收集的。所有Erlang数据类型都是垃圾收集的。如果您真的想深入了解细节,有几个注意事项,但无需真正担心:

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

为什么不使用PID?好的,我将使用PID。