我使用erts_debug:size/1
计算erlang VM中的atom的内存,但我发现输出为零。谁可以解释原因?
7> erts_debug:size(true).
0
答案 0 :(得分:6)
原因是原子与原子的数据一起被固定在原子表中,因此整个节点中只有一个原子的副本。这意味着在您的数据中,atom只是原子表中的标记引用,不占用空间。因此,大小为零。
所以这不是一个不一致或错误。
答案 1 :(得分:4)
在文档中,您可以阅读:
%% size(Term)
%% Returns the size of Term in actual heap words. Shared subterms are
%% counted once. Example: If A = [a,b], B =[A,A] then size(B) returns 8,
%% while flat_size(B) returns 12.
这里的关键字是HEAP。进程有堆栈和堆。有一个很棒的演示文稿,它可以显示存储在堆上的内容以及堆栈中的内容,当创建一个术语时(从第8页开始阅读)。
http://www.erlang-factory.com/upload/presentations/467/Halfword_EUC_2011.pdf
基本上,当你创建一个原子时。堆上没有任何内容,堆栈上有一个单词指针。它指向原子表,它也消耗内存而不是垃圾收集(永远不会在您的应用程序中动态创建原子!)。资料来源:http://www.erlang.org/doc/efficiency_guide/processes.html