In OpenWebBeans we face a similar problem. Over there it's caused by the fact that we need to do lots of classpath scanning and basically every class.getDeclaredMethod() class.getDeclaredField() etc sucks in lots of trash to the classloader.
Grab a yourkit test license and check the classloader usage. As already discussed with David: We'd like to extend xbean finder so that it parses fields + annotations, methods + annotations, class-annotations, etc without flooding the ClassLoader. That could later also been done via a central approach where projects (openejb, openwebbeans, myfaces, ...) 'register' themself on startup and then only one class scanning is been performed for the registered criterias [1] LieGrue, strub [1] https://github.com/struberg/Apache-commons-classscanner --- On Wed, 3/30/11, Jonathan Gallimore <[email protected]> wrote: > From: Jonathan Gallimore <[email protected]> > Subject: Re: PermGen space usage > To: [email protected] > Date: Wednesday, March 30, 2011, 10:57 PM > On Wed, Mar 30, 2011 at 9:34 PM, > David Blevins <[email protected]>wrote: > > > > > 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. > > > That file on people.apache.org is a log using > -class:verbose which I started > after letting TomEE start up, and then I dropped the > moviefun.war in - so it > should show the 15000 or so added classes. I've also done a > log for all the > classes TomEE loads right from the start without deploying > any extra apps, > and a log from the start for all the classes with moviefun > deployed. I can't > seem to get these onto people.apache.org at the moment, but > they're > available from http://home.jrg.me.uk/~jgallimore > > > > 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. > > > > I haven't had a look at that yet, but I'll have a quick > scan through the OWB > code next and report back with any findings. Thanks for the > pointer! > > > > > > 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. > > > > Whoops! We should definitely remove that. > > > > > > Thanks for looking at this BTW! > > > > No problem - I've enjoyed it, and I've learned a lot too! > > Jon >
