[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