在 erlang 中分配的 eheap

eheap allocated in erlang

我使用 recon_alloc:memory(allocated_types) 并获取如下信息。

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。但是总结一下所有进程的heap_size

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

只有 683M!知道 28G 在哪里吗?

在 Erlang 源代码中搜索 eheap_alloc 关键字,我没有找到太多。最相关的一段代码是 XML 来自 erts_alloc.xml (https://github.com/erlang/otp/blob/172e812c491680fbb175f56f7604d4098cdc9de4/erts/doc/src/erts_alloc.xml#L46) 的代码:

<tag><c>eheap_alloc</c></tag>
<item>Allocator used for Erlang heap data, such as Erlang process heaps.</item>

这表示进程堆存储在 eheap_alloc 中,但没有说明 eheap_alloc 中还存储了什么。 eheap_alloc 存储了您的应用程序 运行 所需的所有内容以及一些额外的内存 以及一些额外的 space,因此 VM 不必每次需要添加内容时,从 OS 请求更多内存。 VM 必须在内存中保留与特定进程无关的内容。例如,大型二进制文件,即使它们可能在进程中使用,也不会存储在该进程中堆。它们存储在名为 binary_alloc 的共享进程二进制堆中。二进制堆以及进程堆和一些额外的内存构成了 eheap_alloc.

在您的情况下,您的 binary_alloc 中似乎有很多内存。 binary_alloc 可能正在使用您 eheap_alloc.

的很大一部分

有关二进制处理结帐这些页面的更多详细信息:

您没有比较正确的值。来自 erlang:process_info

{heap_size, Size}
Size is the size in words of youngest heap generation of the process. This generation currently include the stack of the process. This information is highly implementation dependent, and may change if the implementation change.

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

中有更多详细信息