MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Memory leak or flawed garbage collector

  • To: mathgroup at
  • Subject: [mg120648] Re: Memory leak or flawed garbage collector
  • From: "Alexey Popkov" <lehin.p at>
  • Date: Tue, 2 Aug 2011 07:11:43 -0400 (EDT)
  • Delivered-to:
  • References: <j0u7mo$fc1$> <j10l01$os6$> <j15738$b4a$>

"Oleksandr Rasputinov" <oleksandr_rasputinov at> wrote:
news:j15738$b4a$1 at
>  From this we may surmise that values are not being cleared for symbols
> appearing in a Module that have gone out of scope if the delayed flag is
> set and if they have also been conditionally evaluated. It appears that
> these values are what is preventing garbage collection; therefore I would
> consider this as a bug in Module (in that it does not recognise when
> values have gone out of scope in all cases) rather than in the garbage
> collector itself.

Consider the following simple experiment without Module:

In[1]:= $HistoryLength=0;

In[3]:= a[1]
Out[3]= 9

In[4]:= Definition[d]
Out[4]= Attributes[d]={Temporary}


As you see, the same bug appears without Module. So I think this is a bug in
the garbage collector itself. As for Module, I feel that this function is
essentially top-level, as opposed to Block. Probably it is possible to write
full analog of Module in top-level Mathematica code.

> Block
> also does not need to create and maintain temporary symbols, and therefore
> offers better performance than Module; it seems that this kind of lexical
> scoping is merely emulated in Mathematica, with dynamic scoping fitting
> more naturally with the language semantics. For these reasons, unless I
> explicitly require the temporary symbols, I generally prefer Block in most
> simple cases, or With where lexical scoping is called for.

Interesting. I agree that Module looks a bit hacky from the point of view of
the overall design of the system. As Richard Fateman wrote in his 1991 year
paper "A review of Mathematica", Module was introduced in version 2 for
fixing inconsistent design of Block scoping and scoping in replacement
rules: defining
g[x_] := Block[{a}, a = 1 + x]
and then evaluating g[a] gives $RecursionLimit::"reclim" error instead of
1+a. Module solves this problem.

  • Prev by Date: Integrate + Conjugate = Indeterminate
  • Next by Date: Re: Why won't this sum evaluate?
  • Previous by thread: Re: Integrate + Conjugate = Indeterminate
  • Next by thread: Re: Memory leak or flawed garbage collector