使用JDO JDOPersistenceManager,我不断从Plumbr获取内存泄漏检测报告,创建和销毁JDOPersistenceManager的正确方法是什么?

丰硕的报告:

对象创建于

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


并被关押

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


最后一行pmf是一个单例,它启动对象并在请求的生存期内使用。 MyServlet是一个httpservlet,并且正在调用doPost。

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;
    }
}


通常,我在try / finally块中使用pmf实例并使用pmf:

PersistenceManager pm = pmf.getPersistenceManager();

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


正确处理pmf singlton的正确方法是什么,以免引起plumbr报告的内存泄漏?

最佳答案

从org.datanucleus.api.jdo.JDOPersistenceManagerFactory的源代码来看,应在请求末尾调用instance.releasePersistenceManager(pm),以正确销毁PersistanceManager并将其从Factory的缓存中删除。

并感谢您使用我们的工具:)
Plumbr开发人员

07-24 09:18