openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Chathuri Wimalasena <kamalas...@gmail.com>
Subject Re: Is there a memory leak with org.apache.openjpa.kernel.FinalizingBrokerImpl
Date Tue, 03 Jun 2014 16:22:35 GMT
Hi,

Thanks for the responses. I checked almost all the places where we are
using entityManager instance and make sure they are closed after they have
been used.

Here are the two suspect classes I'm getting when analysing the memory dump.

*Problem Suspect 1*

546,326 instances of *"org.apache.openjpa.kernel.FinalizingBrokerImpl"*,
loaded by *"sun.misc.Launcher$AppClassLoader @ 0x7007c7bc0"* occupy
*1,031,525,848
(56.39%)* bytes. These instances are referenced from one instance of
*"java.util.concurrent.ConcurrentHashMap$Segment[]"*, loaded by *"<system
class loader>"*

*Keywords*
java.util.concurrent.ConcurrentHashMap$Segment[]
sun.misc.Launcher$AppClassLoader @ 0x7007c7bc0
org.apache.openjpa.kernel.FinalizingBrokerImpl


*Problem Suspect 2*

546,300 instances of *"org.apache.openjpa.kernel.LocalManagedRuntime"*,
loaded by *"sun.misc.Launcher$AppClassLoader @ 0x7007c7bc0"* occupy
*680,034,240
(37.17%)* bytes. These instances are referenced from one instance of
*"java.util.concurrent.ConcurrentHashMap$Segment[]"*, loaded by *"<system
class loader>"*

*Keywords*
java.util.concurrent.ConcurrentHashMap$Segment[]
sun.misc.Launcher$AppClassLoader @ 0x7007c7bc0
org.apache.openjpa.kernel.LocalManagedRuntime

This is how we create the Entity manager instance.
 public static EntityManager getEntityManager(){
        if (factory == null) {
            String connectionProperties = "DriverClassName=" +
Utils.getJDBCDriver() + "," + "Url=" +
              Utils.getJDBCURL() + "," +"Username=" + Utils.getJDBCUser() +
"," +                                           "Password=" +
Utils.getJDBCPassword() + ",validationQuery=" +
                    Utils.getValidationQuery() + "," +

Utils.getJPAConnectionProperties();
            Map<String, String> properties = new HashMap<String, String>();
            properties.put("openjpa.ConnectionDriverName",
"org.apache.commons.dbcp.BasicDataSource");\
            properties.put("openjpa.ConnectionProperties",
connectionProperties);
            properties.put("openjpa.DynamicEnhancementAgent", "true");
            properties.put("openjpa.RuntimeUnenhancedClasses",
"unsupported");
            properties.put("openjpa.DataCache","true(CacheSize=5000,
SoftReferenceSize=0)");
            properties.put("openjpa.QueryCache","true(CacheSize=5000,
SoftReferenceSize=0)");
            properties.put("openjpa.RemoteCommitProvider","sjvm");
            properties.put("openjpa.Log","DefaultLevel=INFO, Runtime=INFO,
Tool=INFO, SQL=INFO");
            properties.put("openjpa.jdbc.SynchronizeMappings",
"buildSchema(ForeignKeys=true)");
            properties.put("openjpa.jdbc.QuerySQLCache", "false");

            factory =
Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, properties);
        }
       return factory.createEntityManager();
    }

This is how we use entityManager and close it.
public void save() throws RegistryException {
        EntityManager em = null;
        try {
            em = ResourceUtils.getEntityManager();
            Gateway existingGateway = em.find(Gateway.class, gatewayName);
            em.close();

            em = ResourceUtils.getEntityManager();
            em.getTransaction().begin();
            Gateway gateway = new Gateway();
            gateway.setGateway_name(gatewayName);
            gateway.setOwner(owner);
            if (existingGateway != null) {
                existingGateway.setOwner(owner);
                gateway = em.merge(existingGateway);
            } else {
                em.persist(gateway);
            }
            em.getTransaction().commit();
            em.close();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new RegistryException(e);
        } finally {
            if (em != null && em.isOpen()) {
                em.close();
            }
        }
    }

Do you see any issues with this implementation ?


Thanks..
Chathuri


On Mon, Jun 2, 2014 at 6:52 PM, Kevin Sutter <kwsutter@gmail.com> wrote:

> The scary part of the proposed patch is what impact this will have on the
> "more important" non-finalizing BrokerImpl...  That is, if these two
> assignments would get reversed now to correct this supposed memory leak
> with FinalizingBrokerImpl, what impact would this have on non-finalizing
> BrokerImpls?
>
>         if
>
> (FinalizingBrokerImpl.class.isAssignableFrom(bv.getTemplateBrokerType(_conf)))
> {
>             return MapBackedSet.decorate(new ConcurrentHashMap(), new
> Object() { });
>         } else {
>             return new
> ConcurrentReferenceHashSet<Broker>(ConcurrentReferenceHashSet.WEAK);
>         }
>
> I mean "more important" since in most cases we want the container to manage
> the lifecycle and, thus, avoid the overhead associated with the
> FinalizingBrokerImpl...
>
>
>
> On Mon, Jun 2, 2014 at 1:26 PM, Chathuri Wimalasena <kamalasini@gmail.com>
> wrote:
>
> > I'm closing all the EntityManagers in a finally block. I will check if I
> > miss any place.
> >
> >
> > On Mon, Jun 2, 2014 at 2:17 PM, Rick Curtis <curtisr7@gmail.com> wrote:
> >
> > > > Any idea why I might get this issue and any suggestions to avoid
> this ?
> > > Please make sure that your application closes all EntityManagers when
> > > you're through with them.
> > >
> > > Thanks,
> > > Rick
> > >
> > >
> > > On Mon, Jun 2, 2014 at 12:20 PM, Chathuri Wimalasena <
> > kamalasini@gmail.com
> > > >
> > > wrote:
> > >
> > > > Hi Devs,
> > > >
> > > > We are using apache openJPA 2.2 version and we experience some memory
> > > leak
> > > > issues. While analyzing the memory dump, I see
> > > > *org.apache.openjpa.kernel.FinalizingBrokerImpl
> > > > *as one suspect for the memory leak.
> > > >
> > > > 311,437 instances of
> > *"org.apache.openjpa.kernel.FinalizingBrokerImpl"*,
> > > > loaded by *"sun.misc.Launcher$AppClassLoader @ 0x117a09088"* occupy
> > > > *585,849,792
> > > > (55.60%)* bytes. These instances are referenced from one instance of
> > > > *"java.util.concurrent.ConcurrentHashMap$Segment[]"*, loaded by
> > *"<system
> > > > class loader>"*
> > > >
> > > > *Keywords*
> > > > java.util.concurrent.ConcurrentHashMap$Segment[]
> > > > sun.misc.Launcher$AppClassLoader @ 0x117a09088
> > > > org.apache.openjpa.kernel.FinalizingBrokerImpl
> > > >
> > > > While searching, I found [1] which is still open. Does this patch
> > applied
> > > > in openJPA 2.2 version ? Any idea why I might get this issue and any
> > > > suggestions to avoid this ?
> > > >
> > > > Thanks..
> > > > Chathuri
> > > >
> > > > [1] https://issues.apache.org/jira/browse/OPENJPA-1193
> > > >
> > >
> > >
> > >
> > > --
> > > *Rick Curtis*
> > >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message