Kevin,

Can you please shed more light? What do you call "embedding" OpenJPA? Is running an ear with a PU in it constitutes the embedding? If yes, is it not enough to call emf.close() for those emf's that are created by the container?
How about an emf created by the application via Persistence.createEMF()?

thanks,
-marina


Kevin Sutter wrote:
Pinaki,
The Embedder of OpenJPA would have to call this method (ie. Geronimo,
WebSphere, WebLogic, etc).  Any application server that embeds OpenJPA may
have to call this method if they run into this memory leak.  From the
discussion on the dev mailing list, it sounds like this problem would be
pervasive across all application servers.  Thus far, Geronimo is the only
one that has reported the problem.

I realize that this is not ideal with the Embedder calling back into OpenJPA
to indicate that a classloader is no longer in service, but from the
discussions, it didn't sound like any other solution was going to suffice.
And, it sounded like from Don's last post on OPENJPA-285 that they were
getting antsy for some type of resolution.  I figured that this change
resolves the situation for now and if we come up with something better or
more generic, then we can change it or add to it later.

Kevin

On 8/1/07, Pinaki Poddar <[EMAIL PROTECTED]> wrote:

Kevin,
  Who calls PCRegistry.deRegister(ClassLoader cl)?


Pinaki Poddar
972.834.2865

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Sent: Wednesday, August 01, 2007 4:56 PM
To: [EMAIL PROTECTED]
Subject: svn commit: r561970 - in
/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa:
enhance/PCRegistry.java util/ImplHelper.java

Author: kwsutter
Date: Wed Aug  1 14:55:44 2007
New Revision: 561970

URL: http://svn.apache.org/viewvc?view=rev&rev=561970
Log:
OPENJPA-285.  I am going ahead with the integration of Kevan's patches
for the two memory leaks found in OpenJPA while testing Geronimo.  I
will post more details in the Issue.

Modified:

openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PC
Registry.java

openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplH
elper.java

Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PC
Registry.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/
org/apache/openjpa/enhance/PCRegistry.java?view=diff&rev=561970&r1=56196
9&r2=561970
========================================================================
======
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PC
Registry.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhanc
+++ e/PCRegistry.java Wed Aug  1 14:55:44 2007
@@ -203,6 +203,23 @@
    }

    /**
+     * De-Register all metadata associated with the given ClassLoader.
+     * Allows ClassLoaders to be garbage collected.
+     *
+     * @param cl the ClassLoader
+     */
+    public static void deRegister(ClassLoader cl) {
+        synchronized (_metas) {
+            for (Iterator i = _metas.keySet().iterator(); i.hasNext();)
{
+                Class pcClass = (Class) i.next();
+                if (pcClass.getClassLoader() == cl) {
+                    _metas.remove(pcClass);
+                }
+            }
+        }
+    }
+
+    /**
     * Returns a collection of class objects of the registered
     * persistence-capable classes.
     */

Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplH
elper.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/
org/apache/openjpa/util/ImplHelper.java?view=diff&rev=561970&r1=561969&r
2=561970
========================================================================
======
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplH
elper.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/I
+++ mplHelper.java Wed Aug  1 14:55:44 2007
@@ -39,7 +39,6 @@
import org.apache.openjpa.lib.util.Closeable;
import org.apache.openjpa.lib.util.ReferenceMap;
import org.apache.openjpa.lib.util.UUIDGenerator;
-import org.apache.openjpa.lib.util.concurrent.ConcurrentHashMap;
import
org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FieldMetaData;
@@ -244,7 +243,8 @@
        Boolean isAssignable = null;
        Map assignableTo = (Map) _assignableTypes.get(from);
        if (assignableTo == null) { // "to" cache doesn't exist, so
create it...
-            assignableTo = new ConcurrentHashMap();
+            assignableTo = new
ConcurrentReferenceHashMap(ReferenceMap.WEAK,
+                    ReferenceMap.HARD);
            _assignableTypes.put(from, assignableTo);
        } else { // "to" cache exists...
            isAssignable = (Boolean) assignableTo.get(to);



Notice:  This email message, together with any attachments, may contain
information  of  BEA Systems,  Inc.,  its subsidiaries  and  affiliated
entities,  that may be confidential,  proprietary,  copyrighted  and/or
legally privileged, and is intended solely for the use of the individual or
entity named in this message. If you are not the intended recipient, and
have received this message in error, please immediately return this by email
and then delete it.



Reply via email to