Cody Boisclair created GROOVY-7886:
--------------------------------------

             Summary: Memory leak when variable is assigned multiple times 
within the same scope
                 Key: GROOVY-7886
                 URL: https://issues.apache.org/jira/browse/GROOVY-7886
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 2.4.7
         Environment: Linux, CentOS 6, amd64
            Reporter: Cody Boisclair


While troubleshooting some code that seemed to be severely leaking memory, I 
discovered something odd in how Groovy handles variable assignments. From what 
I can tell, when a variable is reassigned multiple times within a scope, all of 
the previous assignments are still retained on the heap until the end of the 
scope.

As a demonstration, I've written a Groovy class which is also valid Java. It 
creates a really large StringBuilder. It calls a method which assigns the 
return value of the StringBuilder's {{toString}} method to a class variable 
repeatedly, both inside and outside of loops; after each assignment, garbage 
collection is run, and the size of the heap is output. Finally, after that 
method is finished, it garbage-collects once again and prints the final heap 
size.

When compiled with {{javac}} and run as Java, there's no leak; the reported 
heap sizes stay fairly constant. Things get considerably more interesting, 
however, when it's run as a Groovy script:

{noformat}
After initial assignment
Current heap: 62514408
Reassigning once inside loop
Current heap: 81562064
Current heap: 81464464
Current heap: 81464464
Current heap: 81464464
Current heap: 81464464
Current heap: 81464464
Current heap: 81464464
Current heap: 81464464
Current heap: 81464464
Current heap: 81464464
Reassigning 3x inside loop
Current heap: 81464552
Current heap: 101464624
Current heap: 121464696
Current heap: 81464616
Current heap: 101464656
Current heap: 121464696
Current heap: 81464616
Current heap: 101464656
Current heap: 121464696
Current heap: 81464616
Current heap: 101464656
Current heap: 121464696
Reassigning 10x outside loop
Current heap: 81464704
Current heap: 101464776
Current heap: 121464848
Current heap: 141464920
Current heap: 161464992
Current heap: 181465064
Current heap: 201465136
Current heap: 221465208
Current heap: 241465280
Current heap: 261465352
After end of doReassignments
Current heap: 81465048
{noformat}

It seems that the older values of the variable only get garbage-collected at 
the end of each scope, and never within any given scope. This is true both for 
the {{for}} loops (the stale values are only deallocated at the end of each 
iteration), and for the {{doReassignments}} method as a whole.

Is this normal behavior for Groovy? It *feels* like a bug, but is there any 
valid reason that the older values for a variable outside the scope might 
actually need to be retained?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to