Erlang 引用是否被垃圾收集?
Are Erlang references garbage collected?
我想将 children 动态添加到 simple_one_for_one
主管。为此,我正在考虑使用 make_ref()
创建一个 child 标识符并将 ref 保留在地图中。一旦 child 终止,ref 将从地图中删除。在这种情况下,垃圾引用会被收集吗?
您没有通过 child_id()
引用 children 位主管,其中 simple_one_for_one
位主管。这些主管只有一个 child_spec()
,并且他们所有的 children 都使用相同的规范,这意味着规范中的 child_id()
被忽略了。 children 由它们的 pid 引用。所以 start_child/2
函数不接受 child_spec()
(也不接受 child_id()
),只有一个参数列表,而 terminate_child/2
接受 pid()
而不是 child_id()
。所以你根本不需要生成引用。
但是,回答你的问题:是的,引用是垃圾收集的。所有 Erlang 数据类型都被垃圾收集。如果你真的想深入了解细节,有一些注意事项,但没有什么好担心的:
- 所有原子都添加到一个原子 table 中,该原子未被垃圾收集。这意味着原子是从进程的堆栈和堆中收集的垃圾,但即使您从每个进程和每个 ETS table 中删除对一个特定原子的所有引用,它仍会留在原子 table 中。
- 二进制文件是垃圾回收的,但它们是跨进程共享的。因此,用于存储二进制文件的内存只有在二进制文件不再用于任何进程时才会被回收。
- 在编写 NIF-s(本机实现的函数,用 C 编写)时,您会看到某些类型被分配为 VM 的引用计数 objects。维护这些 objects 的引用计数器是 NIF 的职责,但是一旦将它们移交给 Erlang 代码,垃圾收集器也会处理它们。
我想将 children 动态添加到 simple_one_for_one
主管。为此,我正在考虑使用 make_ref()
创建一个 child 标识符并将 ref 保留在地图中。一旦 child 终止,ref 将从地图中删除。在这种情况下,垃圾引用会被收集吗?
您没有通过 child_id()
引用 children 位主管,其中 simple_one_for_one
位主管。这些主管只有一个 child_spec()
,并且他们所有的 children 都使用相同的规范,这意味着规范中的 child_id()
被忽略了。 children 由它们的 pid 引用。所以 start_child/2
函数不接受 child_spec()
(也不接受 child_id()
),只有一个参数列表,而 terminate_child/2
接受 pid()
而不是 child_id()
。所以你根本不需要生成引用。
但是,回答你的问题:是的,引用是垃圾收集的。所有 Erlang 数据类型都被垃圾收集。如果你真的想深入了解细节,有一些注意事项,但没有什么好担心的:
- 所有原子都添加到一个原子 table 中,该原子未被垃圾收集。这意味着原子是从进程的堆栈和堆中收集的垃圾,但即使您从每个进程和每个 ETS table 中删除对一个特定原子的所有引用,它仍会留在原子 table 中。
- 二进制文件是垃圾回收的,但它们是跨进程共享的。因此,用于存储二进制文件的内存只有在二进制文件不再用于任何进程时才会被回收。
- 在编写 NIF-s(本机实现的函数,用 C 编写)时,您会看到某些类型被分配为 VM 的引用计数 objects。维护这些 objects 的引用计数器是 NIF 的职责,但是一旦将它们移交给 Erlang 代码,垃圾收集器也会处理它们。