openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rick Curtis <curti...@gmail.com>
Subject Re: Is there a memory leak with org.apache.openjpa.kernel.FinalizingBrokerImpl
Date Fri, 06 Jun 2014 14:42:39 GMT
Can you post your heapdump somewhere?


On Fri, Jun 6, 2014 at 9:05 AM, Chathuri Wimalasena <kamalasini@gmail.com>
wrote:

> Appreciate someone's insight on this issue.
>
> Thanks..
> Chathuri
>
>
> On Tue, Jun 3, 2014 at 12:22 PM, Chathuri Wimalasena <kamalasini@gmail.com
> >
> wrote:
>
> > 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*
> >> > >
> >> >
> >>
> >
> >
>



-- 
*Rick Curtis*

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