Memory 在erlang中分配的eheap

Memory 在erlang中分配的eheap,memory,erlang,Memory,Erlang,我使用recon_alloc:memory(分配的类型)并获得如下信息 34> recon_alloc:memory(allocated_types). [{binary_alloc,1546650440}, {driver_alloc,21504840}, {eheap_alloc,28704768840}, {ets_alloc,526938952}, {fix_alloc,145359688}, {ll_alloc,403701800}, {sl_alloc,688968

我使用recon_alloc:memory(分配的类型)并获得如下信息

34> recon_alloc:memory(allocated_types).
[{binary_alloc,1546650440},
 {driver_alloc,21504840},
 {eheap_alloc,28704768840},
 {ets_alloc,526938952},
 {fix_alloc,145359688},
 {ll_alloc,403701800},
 {sl_alloc,688968},
 {std_alloc,67633992},
 {temp_alloc,21504840}] 
eheap_alloc使用的是28G。但总结一下所有进程的堆大小

>lists:sum([begin {_, X}=process_info(P, heap_size), X end || P <- processes()]).
683197586

>列表:sum([begin{uu,X}=process_info(P,heap_size),X end | | P

在Erlang源代码中搜索eheap_alloc关键字,我没有找到多少。最相关的代码是来自erts_alloc.XML()的XML代码:

eheap\u alloc
用于Erlang堆数据(如Erlang进程堆)的分配器。
这意味着进程堆存储在
eheap\u alloc
中,但它没有说明
eheap\u alloc
中还存储了什么
eheap\u alloc
存储了应用程序运行所需的所有内容以及一些额外的内存和空间,因此VM不必向每次需要添加某些内容时,都会使用e OS。虚拟机必须在内存中保存一些与特定进程无关的内容。例如,大型二进制文件,即使可能在进程中使用,也不会存储在该进程堆中。它们存储在名为
binary\u alloc.二进制堆、进程堆和一些额外内存构成了
eheap\u alloc

在您的情况下,您的
binary\u alloc
中似乎有大量内存
binary\u alloc
可能使用了
eheap\u alloc
的很大一部分

有关二进制处理的更多详细信息,请参见以下页面:


您没有比较正确的值。从

{堆大小,大小}
Size是最年轻的堆生成的字的大小 进程。此生成当前包括进程的堆栈。 此信息高度依赖于实现,如果 实施的变化


recon_alloc:memory(allocated_types)默认为字节。您可以使用set_unit更改它。它不是当前使用的内存,而是由分组到不同分配器的VM保留的内存。您可以使用recon_alloc:memory(used)相反,

eheap中的更多详细信息还包括旧堆,heap\u size仅包括年轻堆。
<tag><c>eheap_alloc</c></tag>
<item>Allocator used for Erlang heap data, such as Erlang process heaps.</item>