使用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开发人员