erlang - Erlang 引用是否被垃圾收集?
问题描述
我想动态地将孩子添加到simple_one_for_one
主管。为此,我正在考虑使用创建子标识符make_ref()
并将 ref 保存在地图中。一旦孩子终止,参考将从地图中删除。这种情况下引用会被垃圾回收吗?
解决方案
您不会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 代码,垃圾收集器也会处理它们。
推荐阅读
- regex - 提取斜线之间的字符串,但第二个斜线可能不存在
- r - 考虑了嵌套 ifelse 中的一些条件
- c# - 如何在不缩放纹理的情况下实现缩放行为?
- function - 如何在arduino代码中定义一个函数来连接wifi模块和arduino uno
- python - 从 pythonanywhere.com 中的 .env 文件读取环境变量
- mysql - 如何在 SQL 的嵌套子查询中查找不同的列?
- python - 如何解析 .trs XML 文件以获取自闭合标签之间的文本?
- jquery - Ag-Grid:应用过滤器后如何保存和重新加载列
- nginx - 错误子域不会在 NGINX 中重定向
- python - 每月显示的唯一 ID 的滚动 12 个月计数