[ http://issues.apache.org/jira/browse/GERONIMO-1062?page=all ]
John Sisson updated GERONIMO-1062:
----------------------------------
Attachment: AllObjects.zip
Thanks Kevan for looking into this.
I have attached AllObjects.zip that contains an export of the YourKit All
Objects view, when I modified the test client application to do 10 lookups (I
did a comparion from a memory snapshot before the first lookup and a memory
snapshot after the 10th lookup).
Unfortunately the -XX:MaxPermSize workaround won't cut it in a production
environment. Hopefully we can get to the bottom of this problem soon.
It appears that the cglib generated classes such as the following are not being
released and therefore end up overflowing the Permanent Generation space.
net.sf.cglib.proxy.Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$7fb24d72
org.openejb.client.EJBHomeProxy$$FastClassByCGLIB$$2dd4c1b0
org.openejb.client.CgLibProxy$$EnhancerByCGLIB$$8b17e15c$$FastClassByCGLIB$$c21cb245
$javax.ejb.EJBHome$$FastClassByCGLIB$$23831ad3
Would be interested to hear your thoughts on why these classes aren't being
released.
Thanks,
John
> OpenEJB client leaks memory on each JNDI lookup. Get OutOfMemoryException
> after a few thousand lookups
> -------------------------------------------------------------------------------------------------------
>
> Key: GERONIMO-1062
> URL: http://issues.apache.org/jira/browse/GERONIMO-1062
> Project: Geronimo
> Type: Bug
> Components: OpenEJB
> Versions: 1.0-M5, 1.0-M4
> Environment: Windows XP
> j2sdk1.4.2_08
> Reporter: John Sisson
> Priority: Critical
> Fix For: 1.0
> Attachments: AllObjects.zip, apps.zip
>
> I have a standalone java application that uses OpenEJB's JNDI implementation
> (org.openejb.client.RemoteInitialContextFactory ). It appears that each JNDI
> lookup of an EJB is leaking memory and it looks like it is related to cglib.
> I have attached to this JIRA a simple EJB and standalone java client
> application that can be used to reproduce the problem.
> Extract the zip file to the geronimo\sandbox directory
> cd sandbox\echoTest
> maven -o
> deploy the echoTest.ear file in the sandbox\echoTest\target directory
> cd sandbox\echoTestStandaloneClient
> maven -o
> cd target
> java -jar echoTestStandaloneClient-0.1-SNAPSHOT.jar
> The console will be updated with the number of lookups performed. E.G here
> are a few examples with different JVM settings:
> C:\OpenSourceJava\geronimo\trunk\sandbox\echoTestStandaloneClient>set
> JAVA_HOME=C:\Program Files\Java\j2sdk1.4.2_08
> C:\OpenSourceJava\geronimo\trunk\sandbox\echoTestStandaloneClient>"%JAVA_HOME%"\bin\java.exe
> -jar target\echoTestStandaloneClient-0.
> 1-SNAPSHOT.jar
> After 0 lookups: delta: 1,911,024, free: 1,911,024, used: 120,592, total:
> 2,031,616, max: 66,650,112
> After 1000 lookups: delta: 417,040, free: 2,328,064, used: 2,603,520, total:
> 4,931,584, max: 66,650,112
> After 2000 lookups: delta: 1,765,304, free: 4,093,368, used: 5,151,304,
> total: 9,244,672, max: 66,650,112
> After 3000 lookups: delta: 1,759,288, free: 5,852,656, used: 7,303,696,
> total: 13,156,352, max: 66,650,112
> After 4000 lookups: delta: 2,182,664, free: 8,035,320, used: 10,081,288,
> total: 18,116,608, max: 66,650,112
> After 5000 lookups: delta: 1,579,184, free: 9,614,504, used: 11,574,104,
> total: 21,188,608, max: 66,650,112
> Lookups performed: 5432
> Exception in thread "main" net.sf.cglib.core.CodeGenerationException:
> java.lang.reflect.InvocationTargetExce
> ption-->null
> at
> net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
> at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
> at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:304)
> at
> org.openejb.client.CgLibProxyFactory.newProxyInstance(CgLibProxyFactory.java:92)
> at
> org.openejb.client.CgLibProxyFactory.newProxyInstance(CgLibProxyFactory.java:81)
> at
> org.openejb.client.ProxyManager.newProxyInstance(ProxyManager.java:90)
> at
> org.openejb.client.EJBHomeHandler.createEJBHomeProxy(EJBHomeHandler.java:106)
> at
> org.openejb.client.JNDIContext.createEJBHomeProxy(JNDIContext.java:212)
> at org.openejb.client.JNDIContext.lookup(JNDIContext.java:245)
> at javax.naming.InitialContext.lookup(InitialContext.java:347)
> at
> org.acme.EchoTestStandaloneClient.testLookup(EchoTestStandaloneClient.java:87)
> at
> org.acme.EchoTestStandaloneClient.main(EchoTestStandaloneClient.java:76)
> Caused by: java.lang.reflect.InvocationTargetException
> at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:324)
> at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)
> at
> net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
> ... 11 more
> Caused by: java.lang.OutOfMemoryError
> If I try this on JDK 1.5.0_05, it is worse as the JVM becomes unresponsive
> and uses a lot of CPU and I have to kill the JVM:
> C:\OpenSourceJava\geronimo\trunk\sandbox\echoTestStandaloneClient>java -jar
> target\echoTestStandaloneClient-0.1-SNAPSHOT.jar
> After 0 lookups: delta: 1,863,336, free: 1,863,336, used: 168,280, total:
> 2,031,616, max: 66,650,112
> After 1000 lookups: delta: 482,408, free: 2,345,744, used: 2,684,144, total:
> 5,029,888, max: 66,650,112
> After 2000 lookups: delta: 1,865,064, free: 4,210,808, used: 5,267,336,
> total: 9,478,144, max: 66,650,112
> After 3000 lookups: delta: 2,116,488, free: 6,327,296, used: 7,967,744,
> total: 14,295,040, max: 66,650,112
> After 4000 lookups: delta: 2,007,008, free: 8,334,304, used: 10,499,104,
> total: 18,833,408, max: 66,650,112
> After 5000 lookups: delta: 2,094,096, free: 10,428,400, used: 13,164,560,
> total: 23,592,960, max: 66,650,112
> Lookups performed: 5099
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira