查看源代码 内存使用

高效编程的一个好的起点是了解不同的数据类型和操作需要多少内存。Erlang 数据类型和其他项消耗多少内存取决于实现,但下表显示了 OTP 19.0 中 erts-8.0 系统的一些数据。

度量单位是内存字。存在 32 位和 64 位两种实现。因此,一个字分别是 4 字节或 8 字节。可以通过调用 erlang:system_info(wordsize) 来确定正在运行的系统的字大小。

数据类型 内存大小
小整数 1 个字。
在 32 位架构上:-134217729 < i < 134217728 (28 位)。
在 64 位架构上:-576460752303423489 < i < 576460752303423488 (60 位)。
大整数 至少 3 个字。
原子 1 个字。
原子指向一个原子表,该表也会消耗内存。对于此表中的每个唯一原子,原子文本仅存储一次。原子表进行垃圾回收。
浮点数 在 32 位架构上:4 个字。
在 64 位架构上:3 个字。
二进制 3-6 个字 + 数据(可以共享)。
列表 1 个字 + 每个元素 1 个字 + 每个元素的大小。
字符串 (与整数列表相同)
1 个字 + 每个字符 2 个字。
元组 2 个字 + 每个元素的大小。
小型映射 (最多 32 个键)
5 个字 + 所有键和值的大小。
大型映射 (超过 32 个键)
N x F 个字 + 所有键和值的大小。
N 是映射中的键数。
F 是一个稀疏因子,由于内部 HAMT 数据结构的概率性质,该因子在 1.6 到 1.8 之间变化。
Pid 当前本地节点的进程标识符 1 个字。
在 32 位上:来自另一个节点的进程标识符 6 个字。
在 64 位上:来自另一个节点的进程标识符 5 个字。
进程标识符指向进程表和节点表,这些表也会消耗内存。
端口 当前本地节点的端口标识符 1 个字。
来自另一个节点的端口标识符 5 个字。
端口标识符指向端口表和节点表,这些表也会消耗内存。
引用 在 32 位架构上:来自当前本地节点的引用 4-7 个字,来自另一个节点的引用 7-9 个字。
在 64 位架构上:来自当前本地节点的引用 4-6 个字,来自另一个节点的引用 6-7 个字。
引用还指向或多或少的仿真器内部数据结构,这些结构也会消耗内存。至少,它指向节点表。
Fun 9..13 个字 + 环境的大小。
fun 指向一个 fun 表,该表也会消耗内存。
Ets 表 初始时 768 个字 + 每个元素的大小(6 个字 + Erlang 数据的大小)。表在必要时会增长。
Erlang 进程 在生成时为 338 个字,包括 233 个字的堆。

表格:不同数据类型的内存大小