View Source Memory Usage
A 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). |
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. |
Float | On 32-bit architectures: 4 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. |
Tuple | 2 words + the size of each element. |
Small Map | (up to 32 keys) 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. |
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. |
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. |
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. |
Fun | 9..13 words + the size of environment. 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