Hi everybody

I had considered to submit a major feature request for Groovy with the text further below, because it appears to me that there might possibly be considerable room for improvement, but since I am not developing Groovy myself I thought that maybe I would just present it here and if people think such a feature request (or a somewhat similar one) would still make sense, it could still be created (by me or someone else)...

---
Improve Groovy class loading performance and memory management

Consider the maybe most typical use case of Groovy as a dynamic language: Within a Java VM, Groovy scripts are dynamically compiled, be it explicitly by using a GroovyShell or a GroovyClassLoader, or more implictly e.g. with a ConfigSlurper.

Qualitatively this often has the following result in the Java VM: Metaspace resp. PermGen, and Heap in parallel, just grow until a configured limit is reached (and note that there is none by default for Metaspace in Java 8 and later), often only then is it garbage collected. With Java classes, at least with simple ones, this looks often different, those appear to be garbage collected much more quickly.

Another qualitative difference is that loading a Groovy class and instantiating it seems typically to be considerably slower than instantiating a Java class with similar functionality, even quite drastically so, more than one would expect even considering the need to create metadata for dynamic function calls etc.

At least that has been my experience over the past few years.

Seen from very far ("management", "marketing", "sales"), this not optimal for a dynamic language, getting these two things right - memory management and class loading performace - is arguably "core business".

Obviously Groovy classes are more complex than most Java classes and there is existing code and limitations of Java VMs and probably more issues...

But in the medium term, I think and feel that it would be good to find out what really impedes better performance and a more regular garbage collection. Possibly the problems are really hard and complex, but some might also be easy, and maybe some would become quite easy after some simple changes in the Java VM, but before such changes can be requested, it has to be analyzed what these could or should be.

Attached is a simple command line Java test program, ClassGCTester.java, that can be used to make some very basic measurements of class loading memory behavior and performance. The source code and a readme with two examples (one for Java and one for Groovy) is also at https://github.com/jexler/classgc, and I think it might help to illustrate current limitations and maybe also a little bit initially with analysis.
---

Note the tool at https://github.com/jexler/classgc and the readme with two illustrative examples - one Java class, one Groovy class - there...

Alain


Reply via email to