You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Erlang中atom占用的内存大小不随其长度变化?

Erlang Atom 存储特性解答

核心实现机制

  • Erlang 内部维护了一个全局的原子表(Atom Table),所有出现过的 Atom 字符串字面量都会在这个表里存储唯一的一份,并且对应一个全局唯一的整数 ID。
  • 无论你是在代码里直接写 Atom 字面量,还是运行时调用list_to_atom/1、binary_to_atom/1这类接口创建 Atom,Erlang 虚拟机都会先做校验:
    • 如果这个字符串已经存在于原子表中,直接返回对应的整数 ID
    • 如果不存在,会把字符串写入原子表,分配新的唯一 ID 再返回
  • 代码运行过程中,所有存储、传递 Atom 的位置,实际上只存这个整数 ID:32 位 Erlang 虚拟机下 ID 占 4 字节,64 位虚拟机下占 8 字节。这就是大家常说「Atom 只占 4/8 字节」的原因,和 Atom 本身的字符串长度完全无关。

Atom 是否会额外消耗内存?

会,这是很常见的认知误区。
大家看到的 4/8 字节只是 Atom 引用的大小,额外的内存消耗是在全局原子表上:

  • 每个首次创建的 Atom,它的字符串内容会永久占用原子表的内存空间,而且 Erlang 不会对原子表做垃圾回收——哪怕你的代码里后续再也没有任何地方用到这个 Atom,这部分内存也不会被释放。
  • Erlang 官方默认给原子表设置了大小上限,默认最大允许存储 1048576 个不同的 Atom,一旦超过这个上限虚拟机会直接崩溃退出。

生产环境下绝对不要把不可控的外部输入(比如用户提交的参数、第三方接口返回的任意字符串)直接转成 Atom,否则很容易被恶意攻击触发原子表溢出,导致服务宕机。


内容的提问来源于stack exchange,提问作者Thành Lợi Nguyễn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:15:05