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

Frank Muller <>
Sun Jan 15 00:03:52 CET 2017


I'm very interested in that too. Last time I asked for help only @Max
Lapshin was kind enough to share some feedbacks (today's Daniel).

I would appreciate if the OTP team can teach us how to debug VM's mem
issues, and  how pick the right allocator.

I'm aware of the excellent recon module. But to be honest, I was never be
able to successfully use it to track my mem issue. Maybe not using it
correctly.

Thanks in advance.

Best,
/Frank

Le sam. 14 janv. 2017 à 21:47, Dániel Szoboszlay <> a
écrit :

> 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
>
>
>
>
> _______________________________________________
>
> erlang-questions mailing list
>
> 
>
> http://erlang.org/mailman/listinfo/erlang-questions
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170114/21f151b9/attachment.html>


More information about the erlang-questions mailing list