2013-11-26 4 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 /, наконец, блокировать и использовать PMF:

PersistenceManager pm = pmf.getPersistenceManager(); 

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

что правильный способ распоряжаться PMF Синглтон так как не вызвать утечку памяти, о которой сообщает plumbr?

+0

Вы хранить любые объекты в полях сервлет? Ваши сервлеты создаются один раз и являются одиночными. – NamshubWriter

ответ

1

Судя по исходному коду org.datanucleus.api.jdo.JDOPersistenceManagerFactory, вы должны вызвать экземпляр.releasePersistenceManager (pm) в конце запроса, чтобы правильно уничтожить PersistanceManager и удалить его из кеша Factory.

И спасибо за использование нашего инструмента :) Plumbr разработчик

0

Я не знаю Nikem Ответит работу и не думаю, что вы должны явно вызвать public void releasePersistenceManager(JDOPersistenceManager pm) потому

  1. Он внутренне вызываются JDOPersistenceManager's public void close().

  2. The comments for this method говорит:

Только PersistenceManager разрешено вызывать этот метод