2013-11-26 78 views
1

使用JDO JDOPersistenceManager,我不断收到来自Plumbr内存泄漏检测报告,什么是创建和销毁JDOPersistenceManagerJDOPersistenceManager内存泄露

正确的方式

Plumbr报告:

创建的对象
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; 
    } 
} 

通常我使用PMF例如在try/finally块,并使用PMF:

PersistenceManager pm = pmf.getPersistenceManager(); 

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

是什么处置PMF singlton的所以正确的方法因为不会导致由plumbr报告的内存泄漏?

+0

你存储在你的servlet领域的任何对象?您的servlet只创建一次,并且是单身人士。 – NamshubWriter

回答

1

根据org.datanucleus.api.jdo.JDOPersistenceManagerFactory的源代码判断,您应该在请求结束时调用instance.releasePersistenceManager(pm)以正确销毁PersistanceManager并将其从Factory的缓存中移除。

感谢您使用我们的工具:) ​​开发商

0

我不知道Nikem的回答作品,不认为你应该明确地调用public void releasePersistenceManager(JDOPersistenceManager pm)因为

  1. 它在内部被称为JDOPersistenceManager的public void close()

  2. The comments for this method说:

只有PersistenceManager的允许调用此方法