I claim no expertise in this domain. I have just some related question 
about the gc:

In static language, we do RAII. In dynamic language, we use gc to free us 
from worrying about the memory. It releases resource automatically when we 
need more memory for new objects. So why bother to call gc() manually?



On Tuesday, August 4, 2015 at 8:18:39 PM UTC+2, Yichao Yu wrote:
>
> On Tue, Aug 4, 2015 at 1:57 PM, Andrew B. Martin 
> <[email protected] <javascript:>> wrote: 
> > I'm having a hard time figuring out how to free up memory by zeroing and 
> > garbage collecting objects in a function. 
> > 
> > function runModel() 
> >     d = generateData() 
> >     d = 0 
> >     gc() 
> > end 
> > 
> > 
> > When I run runModel() in the REPL memory usage remains as if d is still 
> > stored in memory. 
> > 
> > Even if I do: 
> > 
> > for i in 1:5 
> >    d = generateData(); 
> >    d = 0 
> >    gc() 
> > end 
> > 
> > Memory is not freed by the garbage collection. 
> > 
> > If I enter: 
> > 
> > julia> d = generateData(); 
> > 
> > julia> d = 0 
> > 
> > julia> gc() 
> > 
> > Then memory from d is freed up. 
> > 
> > I've looked at this SO question: 
> > 
> http://stackoverflow.com/questions/25871711/julia-garbage-collection-inside-functions-works-differently-than-in-global-spac
>  
> > but it doesn't provide any answers. 
> > 
>
> Short answer: 
>
> Don't assume calling gc() can free any specific object and in general, 
> don't use gc() as a way to free any particular resourse. You will be 
> better off to be more explicit. 
>
> Longer answer: 
>
> The lifetime analysis of variables is pretty conservative, and the 
> effect you see can easily be caused by inlining. 
>
> Suppose you have the following functions 
> ``` 
> f() = (a = allocate_something_big(); a) 
> g() = (b = f(); b = 0; gc()) 
> ``` 
>
> now after inlining, g will look something like 
>
> ``` 
> function test3() 
>     a = allocate_something_big() 
>     b = a 
>     b = 0 
>     gc() 
> end 
> ``` 
>
> Currently all the local variables are kept alive so the new variables 
> introduced by inlining can easily keep an object alive unexpectedly. 
>
> Also, it's worth noting that calling `gc()` (i.e. `gc(true)`) might 
> actually make the object live longer due to the promotion to the old 
> generation that is scanned less frequently. 
>
> > 
> > Why is memory freed when run garbage collection is done in the global 
> scope, 
> > but not in a function or for-loop? 
>

Reply via email to