[erlang-questions] Memory leak question

Edwin Fine erlang-questions_efine@REDACTED
Mon Sep 22 16:39:53 CEST 2008


I'm confused; how exactly is the receive/if changed? Looks the same to me.
Am i missing something?

On Mon, Sep 22, 2008 at 10:08 AM, Paul Oliver <puzza007@REDACTED> wrote:

> Hi all,
>
> I've written a test client that starts a number of sockets and
> repeatedly sends and receives a static sting from an echo server.
> I've noticed some strange behavior with an if statement and was
> wondering if someone can tell me why?  The following code seems to
> leak memory and processes until my box is hosed:
>
> loop(Sock, Log) ->
>        Before = if Log -> now();
>                                true -> 0
>                         end,
>        ok = gen_tcp:send(Sock,
>
> <<"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789">>),
>        receive
>                {tcp, Sock, _Data} ->
>                        if Log ->
>                                        [{total, Total}, {processes,
> Processes} , _, _, _, _, {binary,
> Binary}, _, _] = erlang:memory(),
>                                        error_logger:info_msg("tot_mem: ~p,
> binary: ~p, procs: ~p, time: ~p",
>
>      [Total, Binary, Processes, timer:now_diff(now(),Before)/1000]);
>                           true -> true
>                        end;
>                Error ->
>                        % Anything other than a data message, print error
>                        error_logger:error_msg(Error)
>        end,
>        receive
>        after ?MESSAGE_INTERVAL ->
>                        true
>        end,
>        loop(Sock, Log).
>
> Example logs:
>
> =INFO REPORT==== 22-Sep-2008::14:53:31 ===
> tot_mem: 587049608, binary: 334781944, procs: 171962344, time: 9.685
>
> [snip - box now running out of swap]
>
> =INFO REPORT==== 22-Sep-2008::15:00:23 ===
> tot_mem: 1261717856, binary: 874756136, procs: 307929080, time: 23137.121
>
>
> However, changing the receive/if to:
>
>        receive
>                {tcp, Sock, _Data} ->
>                        [{total, Total}, {processes, Processes} , _, _, _,
> _, {binary,
> Binary}, _, _] = erlang:memory(),
>                        if Log ->
>                                        error_logger:info_msg("tot_mem: ~p,
> binary: ~p, procs: ~p, time: ~p",
>
>      [Total, Binary, Processes, timer:now_diff(now(),Before)/1000]);
>                           true -> true
>                        end;
>
> allows the program to run without leaking anything.
>
> Any help greatly appreciated.
>
> Cheers,
> Paul.
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20080922/dba07a44/attachment.htm>


More information about the erlang-questions mailing list