Memory Usage
View SourceA good start when programming efficiently is to know how much memory different
data types and operations require. It is implementation-dependent how much
memory the Erlang data types and other items consume, but the following table
shows some figures for the erts-8.0
system in OTP 19.0.
The unit of measurement is memory words. There exists both a 32-bit and a 64-bit
implementation. A word is therefore 4 bytes or 8 bytes, respectively. The value
for a running system can be determined by calling
erlang:system_info(wordsize)
.
Data Type
Memory Size
Small integer
1 word.
On 32-bit architectures: -134217729 < i < 134217728 (28 bits).
On 64-bit architectures: -576460752303423489 < i < 576460752303423488 (60 bits).
On 32-bit architectures: -134217729 < i < 134217728 (28 bits).
On 64-bit architectures: -576460752303423489 < i < 576460752303423488 (60 bits).
Large integer
At least 3 words.
Atom
1 word.
An atom refers into an atom table, which also consumes memory. The atom text is stored once for each unique atom in this table. The atom table is not garbage-collected.
An atom refers into an atom table, which also consumes memory. The atom text is stored once for each unique atom in this table. The atom table is not garbage-collected.
Float
On 32-bit architectures: 4 words.
On 64-bit architectures: 3 words.
On 64-bit architectures: 3 words.
Binary
3-6 words + data (can be shared).
List
1 word + 1 word per element + the size of each element.
String
(is the same as a list of integers)
1 word + 2 words per character.
1 word + 2 words per character.
Tuple
2 words + the size of each element.
Small Map
(up to 32 keys)
5 words + the size of all keys and values.
5 words + the size of all keys and values.
Large Map
(more than 32 keys)
N x F words + the size of all keys and values.
N is the number of keys in the Map.
F is a sparsity factor that varies between 1.6 and 1.8 due to the probabilistic nature of the internal HAMT data structure.
N x F words + the size of all keys and values.
N is the number of keys in the Map.
F is a sparsity factor that varies between 1.6 and 1.8 due to the probabilistic nature of the internal HAMT data structure.
Pid
1 word for a process identifier from the current local node.
On 32-bit: 6 words for a process identifier from another node.
On 64-bit: 5 words for a process identifier from another node.
A process identifier refers into a process table and a node table, which also consumes memory.
On 32-bit: 6 words for a process identifier from another node.
On 64-bit: 5 words for a process identifier from another node.
A process identifier refers into a process table and a node table, which also consumes memory.
Port
1 word for a port identifier from the current local node.
5 words for a port identifier from another node.
A port identifier refers into a port table and a node table, which also consumes memory.
5 words for a port identifier from another node.
A port identifier refers into a port table and a node table, which also consumes memory.
Reference
On 32-bit architectures: 4-7 words for a reference from the
current local node, and 7-9 words for a reference from another
node.
On 64-bit architectures: 4-6 words for a reference from the current local node, and 6-7 words for a reference from another node.
A reference also refers into more or less emulator internal data structures which also consumes memory. At a minimum it refers into the node tables.
On 64-bit architectures: 4-6 words for a reference from the current local node, and 6-7 words for a reference from another node.
A reference also refers into more or less emulator internal data structures which also consumes memory. At a minimum it refers into the node tables.
Fun
9..13 words + the size of environment.
A fun refers into a fun table, which also consumes memory.
A fun refers into a fun table, which also consumes memory.
Ets table
Initially 768 words + the size of each element (6 words +
the size of Erlang data). The table grows when necessary.
Erlang process
338 words when spawned, including a heap of 233 words.
Table: Memory Size of Different Data Types