2013-11-26 77 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的允許調用此方法