Search code examples
javamemory-leaksjdopersistence.xml

JDOPersistenceManager memory leak


Using JDO JDOPersistenceManager, I keep getting memory leak detection reports from Plumbr, what is the correct way to create and destroy a JDOPersistenceManager

Plumbr report:

The objects are created at

org.datanucleus.api.jdo.JDOPersistenceManagerFactory.newPM(org.datanucleus.api.jdo.JDOPersistenceManagerFactory, java.lang.String, java.lang.String):838

and are being held

in key of java.util.HashMap$Entry
in table of java.util.HashMap
in map of java.util.HashSet
in pmCache of org.datanucleus.api.jdo.JDOPersistenceManagerFactory
in pmf of com.example.MyServlet

the last line, pmf is a singleton which initiates the object and used through the lifetime of the request. MyServlet is an httpservlet and a doPost is being called.

PMF.java:

public class PMF {

    private static PersistenceManagerFactory instance;

    public static PersistenceManagerFactory get() {

        if (instance == null) {
            Properties props = new Properties();
            props.setProperty("javax.jdo.PersistenceManagerFactoryClass",
                    "org.datanucleus.api.jdo.JDOPersistenceManagerFactory");
            props.put("datanucleus.PersistenceUnitName", "pmf");
            instance = JDOHelper.getPersistenceManagerFactory(props);
        }
        return instance;
    }
}

typically i use the pmf instance in a try / finally block and use pmf:

PersistenceManager pm = pmf.getPersistenceManager();

    try {
    //do stuff
    }
    finally {
    pm.close();
    }

what is the correct way to dispose of the pmf singlton so as not to cause a memory leak as reported by plumbr?


Solution

  • Judging by the source code of org.datanucleus.api.jdo.JDOPersistenceManagerFactory , you should call instance.releasePersistenceManager(pm) at the end of the request in order to properly destroy PersistanceManager and remove it from Factory's cache.

    And thanks for using our tool :) Plumbr developer