On 17.05.16 07:53, Alain Stalder wrote:
I will definitely try out the InvokerHelper.removeClass(clazz) with added ClassInfo removal plus Introspector.flushFromCaches(clazz) and see if I can get garbage collection before reaching the limit on Metaspace or Heap.
Fantastic, I really got it to work :)

I took groovy master plus changes for GROOVY-7646 and GROOVY-7683 and modified the test in ClassGCTester as follows:

--
                long nanoT0 = System.nanoTime();
                Class<?> clazz = classLoader.loadClass(testClassName);
                long nanoT1 = System.nanoTime();
                clazz.newInstance();
                long nanoT2 = System.nanoTime();
                loadTimeTotal += (nanoT1 - nanoT0);
                createTimeTotal += (nanoT2 - nanoT1);
                weakFillingClassesMap.put(clazz, "");

                // added:
                Class<?> invokerHelperClass = ClassGCTester.class.getClassLoader().loadClass("org.codehaus.groovy.runtime.InvokerHelper");
                Method removeClassMethod = invokerHelperClass.getDeclaredMethod("removeClass", Class.class);
                removeClassMethod.invoke(null, clazz);
                //Introspector.flushFromCaches(clazz);
--

An then ran the test as follows (not using ClassValue, loading the test class not from the same ClassLoader as Groovy itself):

$ java -XX:MaxMetaspaceSize=64m -Xmx512m -cp .:groovy-2.5.0-SNAPSHOT.jar ClassGCTester -cp filling/ -parent tester -classes GroovyFilling

--
Secs Test classes              Metaspace/PermGen                 Heap   Load time Create time
       #loaded  #remaining        used committed       used committed     average     average
   0         1           1       6.3m       6.5m      12.8m    245.5m     0.838ms    11.112ms
   1       486         486       9.2m      10.5m      27.6m    245.5m     0.326ms     1.624ms
   2      1404        1404      12.7m      16.1m      30.3m    245.5m     0.244ms     1.124ms
   3      2308          61       7.6m      16.8m      12.2m    228.5m     0.241ms     1.014ms
   4      3461        1214      12.0m      16.8m      46.4m    244.0m     0.212ms     0.908ms
   5      4577        2330      16.3m      21.4m      69.1m    240.0m     0.200ms     0.860ms
   6      5581        3334      20.1m      27.4m      75.1m    237.5m     0.197ms     0.847ms
   7      6703         974      11.1m      18.2m      11.3m    268.0m     0.197ms     0.818ms
   8      7996        2267      16.0m      23.4m      65.7m    253.5m     0.188ms     0.786ms
   9      9261        3532      20.9m      28.5m     115.1m    267.5m     0.182ms     0.765ms
  10     10518         960      11.0m      20.0m      10.9m    285.0m     0.181ms     0.747ms
  11     11841        2283      16.1m      24.0m      68.9m    285.0m     0.177ms     0.730ms
  12     13097        3539      20.9m      29.0m     113.9m    285.0m     0.173ms     0.722ms
  13     14288         331       8.7m      21.3m      49.6m    314.0m     0.174ms     0.715ms
  14     15640        1683      13.8m      22.9m     105.5m    316.0m     0.170ms     0.705ms
  15     16923        2966      18.7m      27.9m     150.4m    315.5m     0.168ms     0.699ms
  16     18128        4171      23.3m      32.6m      54.6m    316.0m     0.166ms     0.697ms
  17     19360         628       9.8m      21.5m      88.6m    347.0m     0.167ms     0.692ms
  18     20707        1975      15.0m      24.6m     137.6m    346.5m     0.165ms     0.685ms
  19     21958        3226      19.7m      29.6m      39.1m    347.5m     0.164ms     0.683ms
  20     23172        4440      24.4m      34.4m      66.4m    349.5m     0.163ms     0.682ms
  21     24430         861      10.7m      21.9m     120.7m    383.5m     0.163ms     0.678ms
  22     25725        2156      15.7m      25.5m      19.0m    381.0m     0.162ms     0.675ms
  23     26986        3417      20.5m      30.5m      49.3m    385.0m     0.161ms     0.674ms
  24     28192        4623      25.1m      35.3m      70.8m    384.5m     0.161ms     0.673ms
  25     29454         956      11.1m      21.0m     134.6m    416.0m     0.161ms     0.671ms
  26     30737        2239      16.0m      26.3m      25.2m    416.5m     0.160ms     0.669ms
[...]
--

Nicely garbage collects repeatedly, Metaspace stay well below the configured maximum of 64m...

PS: Note that Introspector.flushFromCaches(clazz) was experimentally really not necessary in this case, but maybe has to do with the simple nature of the test script ("42") and only calling a (no-args) constructor... In any case very promising...

Alain