>@Szczepan, this would be a good candidate to add to your list: reusing warmed up user classes (which includes scripts and plugins) should give a nice performance improvement to build time, and configuration time in particular, with the daemon
Is there a chance it also tangibly reduces the heap consumption? How big this story is? Say that I'm interested in a tangible performance improvement (+ perhaps heap), without yet solving those other interesting use cases. Cheers! On Fri, Jun 7, 2013 at 1:19 AM, Adam Murdoch <adam.murd...@gradleware.com>wrote: > > On 05/06/2013, at 3:38 PM, Luke Daley <luke.da...@gradle.biz> wrote: > > > > On 05/06/2013, at 2:37, Adam Murdoch <adam.murd...@gradleware.com> wrote: > > > On 05/06/2013, at 3:57 AM, Luke Daley <luke.da...@gradleware.com> wrote: > > Hi, > > I just tracked down a memory leak in the Artifactory plugin. I've raised > with them to fix this, but this is a symptom of a more general leak we have > in placeā¦ I think. > > Groovy keeps a global registry of metaclass of all loaded classes that get > touched by Groovy. We load Groovy in a persistent classloader across > builds. This means that build level user classes (e.g. non core plugins) > end up getting loaded into Groovy's metaclass registry each time there is a > build. This means we are always leaking permgen, and that we are very > susceptible to bad leaks if user code keeps a static state reference to > something, as was the case with the artifactory plugin. They ended up > holding on to a reference of the root project statically (through Groovy > meta programming) which means a lot was leaked. > > We can't really change the classloader structure to unload the whole meta > class registry between builds as that would defeat the main purpose of the > daemon: to load Groovy once. > > > The purpose of the daemon is to keep the things that a build needs > warmed-up. This includes groovy, but it also includes the user classes used > by the build (and other state, too). So, we only want to discard the > classes and associated meta-data that we think are unlikely to be needed > any more - classes from class loaders that we discard because their > classpath has changed or class loaders that we discard because we haven't > run the associated build for a while. > > > My read of things was that we don't cache any user code at the moment. The > growing meta class registry seems to indicate that we are dumping user > classes between builds. > > > I got confused. We aren't reusing anything. For some reason I thought we > had implemented this. This would be a good place to start as far as fixing > the leak goes. > > @Szczepan, this would be a good candidate to add to your list: reusing > warmed up user classes (which includes scripts and plugins) should give a > nice performance improvement to build time, and configuration time in > particular, with the daemon. With the daemon, we see roughly a 20% > improvement in execution time between the 2nd and 5th (or so) build > invocations as the hotspot compiler does its thing. This is beyond the > initial improvement between the 1st and 2nd invocations. I'd expect to see > something similar for user code. > > It also reduces the chance of memory leaks. It eliminates some types of > problems and adds some others, but I think on the balance it should be > better. > > Reusing the user classes means we'd need to track changes to classpaths > efficiently, and this means we can do some interesting things on change: > - invalidate a task's outputs when the task implementation changes > - notify the tooling API client that the model may have changed. > > And we can cache some interesting information derived from a classpath: > - the API for the classpath, which can be used for up-to-date checks and > compilation. > - plugin meta-data scanned from the classpath (eg @Plugin(id='my-plugin') > annotation, or plugin supplied services). > - test detection. > - the project model, or enough of the model to decide it the project's > outputs are up-to-date or not. > > > -- > Adam Murdoch > Gradle Co-founder > http://www.gradle.org > VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting > http://www.gradleware.com > > Join us at the Gradle Summit 2013, June 13th and 14th in Santa Clara, CA: > http://www.gradlesummit.com > > -- Szczepan Faber Principal engineer@gradleware; Lead@mockito Join me at the Gradle Summit 2013, June 13th and 14th in Santa Clara, CA: http://www.gradlesummit.com