[erlang-questions] gen_server state is not released for gc

Björn-Egil Dahlberg egil@REDACTED
Fri Jan 13 19:00:20 CET 2012


On 2012-01-13 18:50, Björn-Egil Dahlberg wrote:
> On 2012-01-13 18:33, Volodymyr Kyrychenko wrote:
>> Hi. Here is simple gen_server that holds binary in its state and never
>> releases it.
>>
>> http://ideone.com/U4f9X
>>
>> 1>  X = myserver:start_link("/tmp/1.cache").
>> {ok,<0.33.0>}
>> 2>  myserver:info().
>> {binary,[{140408119021616,401681797,2}]}
>> 3>  myserver:release().
>> ok
>> 4>   myserver:info().
>> {binary,[{140408119021616,401681797,2}]}
>> 7>  memory(binary).
>> 402043632
>>
>> How come there are 2 references on it and what to do to free this 
>> binary?
> it is not gc:ed yet.

To be a little more specific. The references (Procbins) to your offheap 
binary are still on the process heap even though nothing in the rootset 
is referencing the procbins. A gc will be triggered when the current 
heap is full, binary vheap is "full" or an explicit garbage_collect is 
called for, which ever comes first. At that moment the procbins will be 
removed and the offheap binary will be deallocated (if nothing else is 
referencing it).

// Björn-Egil

> Try erlang:garbage_collect/0 info:
>
> handle_call(info, _From, State) ->
>
>   erlang:garbage_collect(),
>
>   {reply, process_info(self(), binary), State};
>
>
> // Björn-Egil
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>




More information about the erlang-questions mailing list