Przeciek pamięci podczas korzystania z kompilatora JDK w czasie wykonywania

Próbuję dodać javaeditor do mojego programu, aby rozszerzyć program w czasie wykonywania. Wszystko działa dobrze, z wyjątkiem sytuacji, gdy program jest intensywnie używany (symulowałem 1000-10000 wykonań kompilatora). Wykorzystanie pamięci wzrasta i rośnie, wygląda na to, że jest wyciek pamięci.

W moim programie klasa zostaje załadowana, konstruktor zostaje wykonany, a klasa zostaje rozładowana (żadna pozostała instancja i klasa nie są niepoprawne, gdy ustawiam wskaźnik na null). Przeanalizowałem proces za pomocą JConsole, klasy zostaną rozładowane, gdy wykonywany jest garbage collector.

Założyłem stertę w analizatorze pamięci, problem wydaje się znajdować w java.net.FactoryURLClassLoader (w obiekcie com.sun.tools.javac.util.List). Ponieważ (com.sun.tools.javac) jest częścią JDK, a nie JRE, a SystemToolClassLoader jest obiektem FactoryURLClassLoader, zlokalizowałbym tam wyciek. Liczba załadowanych klas w SystemToolClassLoader wzrasta z 1 do 521, gdy wykonuję kompilator po raz pierwszy, ale później pozostaje taki sam.

Więc nie mam pojęcia, gdzie jest wyciek, czy istnieje sposób na zresetowanie narzędzia SystemToolClassLoader? Jak mogę dokładniej zlokalizować wyciek.

EDYCJA: Dobra, dowiedziałem się, że występuje również w bardzo prostym przykładzie. Więc wydaje się, że jest częścią kompilacji, nie muszę ładować klasy ani tworzyć jej instancji:

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;


public class Example {   

public static void main(String[] args)
{
    for (int i =0; i<10000;i++){
        try {
            System.out.println(i);
            compile();
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

public static void compile() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException
{
    File source = new File( "src\\Example.java" ); // This File
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager( null, null, null );
    Iterable<? extends JavaFileObject> units;
    units = fileManager.getJavaFileObjectsFromFiles( Arrays.asList( source ) );
    compiler.getTask( null, fileManager, null, null, null, units ).call();
    fileManager.close();
}

}

questionAnswers(5)

yourAnswerToTheQuestion