檢視原始碼 記憶體用量

有效率程式設計的良好起點是了解不同資料類型和操作需要多少記憶體。 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 個字組。
程序識別碼指向程序表和節點表,這也會消耗記憶體。
Port 來自目前本機節點的埠識別碼為 1 個字組。
來自另一個節點的埠識別碼為 5 個字組。
埠識別碼指向埠表和節點表,這也會消耗記憶體。
參考 在 32 位元架構上:來自目前本機節點的參考為 4-7 個字組,來自另一個節點的參考為 7-9 個字組。
在 64 位元架構上:來自目前本機節點的參考為 4-6 個字組,來自另一個節點的參考為 6-7 個字組。
參考也會指向更多或更少的模擬器內部資料結構,這也會消耗記憶體。至少它會指向節點表。
Fun 9..13 個字組 + 環境的大小。
Fun 指向 fun 表,這也會消耗記憶體。
Ets 表 初始為 768 個字組 + 每個元素的大小(6 個字組 + Erlang 資料的大小)。表格會在必要時擴展。
Erlang 程序 在產生時為 338 個字組,包括 233 個字組的堆積。

表格:不同資料類型的記憶體大小