[erlang-questions] How can I release beam process memory?

Jack Tang <>
Sun Jan 15 07:09:41 CET 2017


Hi Daniel

Thank you for the clue and excellent recon toolkits! I would like dig it
deeper  :)

BR
-Jack

On Sun, Jan 15, 2017 at 4:47 AM, Dániel Szoboszlay <>
wrote:

> Hi Jack,
>
> I guess the 9 GB is lost due to memory fragmentation. Erlang allocates
> memory in large chunks called carriers from the OS, then places the blocks
> your program actually needs on these carriers. A carrier can only be
> returned to the OS once all the blocks on it have been freed (and even
> then, the memory allocator may decide to keep it around for a while in case
> more memory is needed).
>
> You can check with recon_alloc
> <https://ferd.github.io/recon/recon_alloc.html> how much unused memory is
> lost due to fragmentation in the various allocators.
>
> The bad news is that you cannot defragment the carriers, and if the
> selected memory allocator strategy doesn't work well for your application,
> you cannot change it either without restarting the emulator.
>
> However, if the memory is wasted in the eheap_alloc, you may try to force
> a GC on all processes a couple of times. As the GC copies the memory, it
> will allocate new blocks and free up the old heap blocks. So there's a
> chance the allocators can compact the blocks together on fewer segments.
> But that's just a guess, it may or may not work at all.
>
> Cheers,
> Daniel
>
> On Sat, 14 Jan 2017 at 08:04 Jack Tang <> wrote:
>
>> Hello list,
>>
>> I run one Erlang application on Debian server and today I find the beam
>> process consumes around 35G memory by `top` command.
>>
>> ```
>> KiB Mem:  99194912 total, 61682656 used, 37512252 free,   397380 buffers
>> KiB Swap:        0 total,        0 used,        0 free. 18684864 cached
>> Mem
>>
>>   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+
>> COMMAND
>> 11858 usr1   20   0 36.850g 0.032t   6220 S  73.5 34.4   8038:49 beam.smp
>> ```
>>
>> I connect to the Erlang application using remote shell and find the
>> mem-leaked supervisor tree and run gc on the whole tree. Code looks like
>> blow:
>>
>> ```
>> lists:foreach(fun(E) -> PId = element(2, E), erlang:garbage_collect(PId)
>> end, supervisor:which_children(some_thing_sup)).
>> ```
>>
>> and erlang:memory() decreases from 32G to 23G.
>> ```
>> [{total,22982011544},
>>  {processes,12884182336},
>>  {processes_used,12884170336},
>>  {system,10097829208},
>>  {atom,13828705},
>>  {atom_used,13796692},
>>  {binary,170530288},
>>  {code,16450626},
>>  {ets,9637717576}]
>> ```
>>
>> However, when I input `top` command, the beam process still takes 35G
>> memory. What can I do to release the 9G memory? Thanks
>>
>> BR
>> -Jack
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>


-- 
Jack Tang


http://www.linkedin.com/in/jacktang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170115/a67dba0b/attachment.html>


More information about the erlang-questions mailing list