[ 
https://issues.apache.org/jira/browse/GROOVY-6704?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14950653#comment-14950653
 ] 

ASF GitHub Bot commented on GROOVY-6704:
----------------------------------------

GitHub user candrews opened a pull request:

    https://github.com/apache/incubator-groovy/pull/137

    GROOVY-6704 Use ClassValue by default on IBM Java

    IBM Java doesn't have the ClassValue garbage collection issue that OpenJDK 
has (https://bugs.openjdk.java.net/browse/JDK-8136353) so when running on that 
JVM, enable ClassValue by default.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/candrews/incubator-groovy patch-1

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/incubator-groovy/pull/137.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #137
    
----
commit d63f5dc62cf26a9abe16c15d046389cc273a7f11
Author: Craig Andrews <candr...@integralblue.com>
Date:   2015-10-09T16:30:10Z

    GROOVY-6704 Use ClassValue by default on IBM Java
    
    IBM Java doesn't have the ClassValue garbage collection issue that OpenJDK 
has (https://bugs.openjdk.java.net/browse/JDK-8136353) so when running on that 
JVM, enable ClassValue by default.

----


> Memory leak in ClassInfo when using MetaClasses
> -----------------------------------------------
>
>                 Key: GROOVY-6704
>                 URL: https://issues.apache.org/jira/browse/GROOVY-6704
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.0.8, 2.1.9
>            Reporter: Craig
>            Assignee: Jochen Theodorou
>            Priority: Critical
>             Fix For: 2.4.0-beta-2
>
>         Attachments: LeakTest.groovy
>
>
> I'm trying to track down a memory leak in Grails and I'm pretty sure I've 
> discovered the root cause of the leak is in Groovy. For reference, here's the 
> thread on the grails-dev list on this topic: 
> http://grails.1312388.n4.nabble.com/Easily-reproducible-memory-leak-in-Grails-td4655816.html
> I also raised this issue on the groovy-dev mailing list at 
> http://groovy.329449.n5.nabble.com/Memory-leak-in-ClassInfo-when-using-MetaClasses-td5719218.html
> The problem is that when a class is loaded, then a metaclass is assigned, 
> then the class is no longer reachable, the metaclass remains in memory. When 
> this happens many times, lots of metaclasses are leaked, which becomes a 
> significant problem. I discovered this problem because this how Grails 
> implements GSPs - by loading the GSP as a groovy class, then when the GSP 
> changes, loading a new class. The old class is unreachable, except for some 
> internal Groovy structures... hence the memory leak.
> Attached there is a junit test that reproduces this problem: 
> [^LeakTest.groovy]
> Eventually, that results in an OutOfMemoryError. Using a tool like visualvm, 
> it is clear that the number of classes constantly rises, none are ever 
> unloaded, and the permgen keeps getting used. The heap also rises. In my 
> tests, it usually dies after about 5,000 iterations.
> In my opinion, this shouldn't happen - this test case should run without 
> leaking memory. Groovy should allow the MetaClasses to be garbage collected 
> once the Class is no longer referenced by anything else. In other words, 
> Groovy should hold a weak reference to the MetaClass/ClassInfo/etc for the 
> Class based on the reachability of the Class.
> By taking a heap dump in visualvm, I found that there are lots of instances 
> of org.codehaus.groovy.runtime.metaclass.MetaMethodIndex$Entry.
> The problem areas (that are GC roots) seem to be:
> org.codehaus.groovy.reflection.ClassInfo's static field modifiedExpandos
> org.codehaus.groovy.reflection.ClassInfo's static field globalClassSet
> The classes that area created by classLoader.parseClass also stick around, 
> which is why the permgen is leaking.
> Can someone please help me determine how to fix this problem in Groovy?



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

Reply via email to