Hello everybody,

 

I use Drools to create rules from an external source and create an artifact from those rule strings, putting it into a local repository.

 

A minimalistic working example can be found at https://github.com/dadadom/MavenMemoryLeakMinimalExample

 

The code, taken from that example, is basically like this:

 

        ReleaseId releaseId = new ReleaseIdImpl("some:releaseid:1.0.0-SNAPSHOT");

        String rules = "rule \"testrule\ … “;

        KieServices kServices = KieServices.Factory.get();

        KieFileSystem kfs = kServices.newKieFileSystem();

        kfs.write("src/main/resources/someBase/testrule", rules);

        kfs.generateAndWritePomXML(releaseId);

        String kmoduleXmlString = "<kmodule … </kmodule>”;

        kfs.writeKModuleXML(kmoduleXmlString.getBytes());

 

        KieModule kieModule = kServices.newKieBuilder(kfs).getKieModule();

 

        try {

            File pomFile = new File(System.getProperty("java.io.tmpdir"), "pom.xml");

            try (FileOutputStream fos = new FileOutputStream(pomFile)) {

                fos.write(KieBuilderImpl.generatePomXml(releaseId).getBytes()); fos.flush();

            } catch (IOException e) {

                e.printStackTrace();

            }

            final MavenRepository mavenRepository = MavenRepository.getMavenRepository();

            mavenRepository.deployArtifact(releaseId, (InternalKieModule) kieModule, pomFile);

 

When I call this method in a ServletContextListener in a Tomcat Server (version 7 or 8) and undeploy the application afterwards, I get a memory leak.

Tomcat tells me that the application has a memory leak:

The following web applications were stopped (reloaded, undeployed), but their

classes from previous runs are still loaded in memory, thus causing a memory

leak (use a profiler to confirm):

/mvntest

 

Looking at the memory dump with e.g. JProfiler, I can trace the dangling instances back to an object

  static INSTANCE of class org.drools.compiler.kie.builder.impl.KieRepositoryImpl

 

So it seems like there is something which I am either missing or which is a bug. I cannot find any .close() or .release() method or something alike on any of the involved objects …

 

If anyone could give me a hint how to solve this problem, I’d be happy not to litter my memory no more J

 

Regards and thanks

Dominik

 


…………………………………………………………………
mit freundlichen Grüßen / kind regards
Dominik Sandjaja
Fon: +49 (0) 203 60878 183
Fax: +49 (0) 203 60878 222
e-mail: dominik.sandjaja@it-motive.de

it-motive AG
Zum Walkmüller 6
47269 Duisburg
info@it-motive.de
http://www.it-motive.de
……………………………………………………………………
Vorsitzender des Aufsichtsrats: Dr.-Ing. Jürgen Sturm
Vorstand: Horst-Dieter Deelmann (Vors.), Matthias Heming, Christoph Tim Klose
HRB 9207, Amtsgericht Duisburg