Erlang VM使用了多少内存?

Bla*_*mba 3 erlang

我想知道这个数据结构将使用Erlang VM中的内存多少?

[{"3GPP-UTRAN-FDD", [{"utran-cell-id-3gpp","CID1000"}, "1996-12-19t16%3a39%3a57-08%3a00", "1996-12-19t15%3a39%3a27%2e20-08%3a00"]}]
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,每个进程都会将这些数据存储在self的循环数据中,此进程的numbert将为120000.

我测试的结果:

不存储这些数据,内存将是:

memory[kB]:  proc 1922806, atom    2138, bin   24890, code   72757, ets  459321
Run Code Online (Sandbox Code Playgroud)

存储这些数据,将是:

memory[kB]:  proc 1684032, atom    2138, bin   24102, code   72757, ets  459080
Run Code Online (Sandbox Code Playgroud)

所以最大的区别是使用的备忘录proc:(1922806 - 1684032) / 1024 = 233M.

经过研究,我发现了一件令人兴奋的事情:

L = [{"3GPP-UTRAN-FDD", [{"utran-cell-id-3gpp","CID1000"}, "1996-12-19t16%3a39%3a57-08%3a00", "1996-12-19t15%3a39%3a27%2e20-08%3a00"]}].
B = list_to_binary(io_lib:format("~p", L)).   
erts_debug:size(B). % The output is 6
Run Code Online (Sandbox Code Playgroud)

使用二进制文件后,内存只使用6个字?怎么解释这个?

Sou*_*lls 6

测量Erlang术语大小有两个有用的功能:erts_debug:size/1和erts_debug:flat_size/1.这两个函数都以单词形式返回术语的大小.

erts_debug:flat_size/1为您提供没有术语共享优化的邮件总大小.如果将它复制到新堆,则保证为该术语的大小,如消息传递和ets表.

erts_debug:size/1 为您提供当前进程堆中的术语大小,允许通过共享重复的术语来优化内存使用.

以下是差异的演示:

1> MyTerm = {atom, <<"binary">>, 1}.
{atom,<<"binary">>,1}
2> MyList = [ MyTerm || _ <- lists:seq(1, 100) ].
[{atom,<<"binary">>,1}|...]
3> erts_debug:size(MyList).
210
4> erts_debug:flat_size(MyList).
1200
Run Code Online (Sandbox Code Playgroud)

如您所见,由于术语共享,因此大小存在显着差异.

至于你的具体术语,我使用了Erlang shell(R16B03)并测量了术语flat_size.根据这个,你的术语的内存使用是:226字(1808B,1.77KB).

对于看似简单的术语来说,这是很多内存,但这超出了本问题的范围.