On Mar 30, 2011, at 6:14 AM, Jonathan Gallimore wrote:

> Hi all,
> 
> I just thought I'd post to see whether any one had any views about our
> PermGen space usage. I've noticed that when running TomEE from a recent
> snapshot, when nothing but the basic openejb webapp is running, our PermGen
> usage sits at around 37MB. If I deploy our moviefun example (which now
> features JPA 2, JSF 2, EJBs, Webservices, JMS etc etc) that increased to
> 140MB - well over the 64MB that the Sun/Oracle JVMs set as a default
> maximum. The class counts are 5618 and 23496 respectively. I've profiled
> this with the YourKit Java Profiler (thanks for the free license if you're
> reading!) and I can't see anything out of the ordinary - it looks like its
> all down to the number of classes being loaded. I can't spot any obvious
> duplication or class loader leakage. Heap wise, everything looks ok - usage
> on this instance was around the 25MB mark.
> 
> 100 MiB = 102400 KiB, which divided by 17878 extra classes works out at 5.7
> KiB per class on average, which sounds reasonable to me, I guess. I've
> uploaded a list of all the classes that are loaded between TomEE starting
> and moviefun being fully deployed here:
> http://people.apache.org/~jgallimore/loaded_classes.txt. One thing that is
> interesting is the system class loader had 19357 classes loaded, and 17973
> classes without instances. Prior to deploying moviefun, the numbers are 3406
> classes, and 2181 without instances - anyone know if there's anything
> significant in those numbers?
> 
> Does anyone have any thoughts on this? I don't necessarily have any problem
> with increasing PermGen on my own installations or recommending others do
> the same, but also feel it would be nice to offer as much as possible
> without requiring users to allocate more memory. I'd be interested in
> hearing anyone else's experiences with this.

Would be cool to get a before/after moviefun list so we could do some 
comparisons.  The system class increase as you point out is very odd.  This 
might be releated to OWB.  I thought I cut that part out, but OWB will try to 
load *every* class it can find.  As I said, I thought I cut that out, but maybe 
it's getting invoked.  I'm not sure where that code is anymore, but grep in OWB 
for calls to loadClass or Class.forName.  Think it might be in their Scanner 
implementation.

Does look like there might be some low hanging fruit.  Seems we are falsely 
including the tomcat libs in our libs and they are getting loaded:

[Loaded org.apache.catalina.mbeans.ServerLifecycleListener from 
file:/Users/jon/demo/apache-tomee-tomcat-7.0.11/webapps/openejb/lib/tomcat-catalina-7.0.8.jar]
[Loaded org.apache.naming.NamingServiceMBean from 
file:/Users/jon/demo/apache-tomee-tomcat-7.0.11/webapps/openejb/lib/tomcat-catalina-7.0.8.jar]
[Loaded org.apache.naming.NamingService from 
file:/Users/jon/demo/apache-tomee-tomcat-7.0.11/webapps/openejb/lib/tomcat-catalina-7.0.8.jar]

We should trim the contents of our lib/ dir down and see how things look.

Thanks for looking at this BTW!


-David

Reply via email to