On 25/02/2008, Guillaume Nodet <[EMAIL PROTECTED]> wrote: > > Thanks Stuart. The exception was catched and the getMessage method > called, so I've > hacked a bit more, but the following patch seems to work great for me.
cool, could you raise a JIRA issue and attach the combined patch - thanks Index: src/main/java/org/apache/felix/moduleloader/ModuleImpl.java > =================================================================== > --- src/main/java/org/apache/felix/moduleloader/ModuleImpl.java > (revision 630863) > +++ src/main/java/org/apache/felix/moduleloader/ModuleImpl.java (working > copy) > @@ -147,10 +147,17 @@ > } > catch (ClassNotFoundException ex) > { > - m_logger.log( > - Logger.LOG_WARNING, > - ex.getMessage(), > - ex); > + // Diagnosing the class loader error is very costly, so only > + // perform this call (indirectly through ex.getMessage()) > + // if necessary. > + // See R4SearchPolicyCore#findClass > + if (m_logger.getLogLevel() >= Logger.LOG_WARNING) > + { > + m_logger.log( > + Logger.LOG_WARNING, > + ex.getMessage(), > + ex); > + } > } > return null; > > } > Index: > src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java > =================================================================== > --- > src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java > > (revision 630863) > > +++ > src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java > (working copy) > @@ -178,7 +178,7 @@ > return null; > } > > - public Class findClass(IModule module, String name) > + public Class findClass(final IModule module, final String name) > throws ClassNotFoundException > { > try > > @@ -191,8 +191,13 @@ > > } > catch (ClassNotFoundException ex) > { > - String msg = diagnoseClassLoadError(module, name); > - throw new ClassNotFoundException(msg, ex); > > + throw new ClassNotFoundException("", ex) > > + { > + public String getMessage() > + { > + return diagnoseClassLoadError(module, name); > + } > + }; > } > > // We should never reach this point. > > > > On Mon, Feb 25, 2008 at 3:37 PM, Stuart McCulloch > <[EMAIL PROTECTED]> wrote: > > On 25/02/2008, Guillaume Nodet <[EMAIL PROTECTED]> wrote: > > > > > > I'm currently working on ServiceMix 4 which uses Felix.\ > > > > > > I have some really important performance problems in classloading. > > > When loading JBI applications (they have some very specific > > > classloading architecture > > > that must be implemented to be JBI compliant), 95% of the time is > > > spent in the following method: > > > R4SearchPolicyCore.diagnoseClassLoadError() > > > which is not really acceptable. > > > > > > The problem is that the classloader is built dynamically and does not > > > completely rely on > > > OSGi. For this reason, the classloader of JBI artifacts delegates to > > > the parent classloader, > > > then looks inside its own jar. This means there will be lots of > > > ClassNotFoundException thrown > > > by the parents classloader (ultimately by Felix). > > > > > > Is there any way to maybe speed / disable the diagnoseClassLoadError > > > method call which > > > is purely informative ? > > > > > > we could try a lazy-load approach (ie. only construct the string in the > > getMessage method) > > for example, you might want to see if the following patch helps, based > on > > the current trunk: > > > > Index: > > > > > src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java > > =================================================================== > > --- > > > > > src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java > > (revision 630859) > > +++ > > > > > src/main/java/org/apache/felix/framework/searchpolicy/R4SearchPolicyCore.java > > (working copy) > > @@ -178,7 +178,7 @@ > > return null; > > } > > > > - public Class findClass(IModule module, String name) > > + public Class findClass(final IModule module, final String name) > > throws ClassNotFoundException > > { > > try > > @@ -191,8 +191,14 @@ > > } > > catch (ClassNotFoundException ex) > > { > > - String msg = diagnoseClassLoadError(module, name); > > - throw new ClassNotFoundException(msg, ex); > > + // lazy construction of exception message > > + throw new ClassNotFoundException("", ex) > > + { > > + public String getMessage() > > + { > > + return diagnoseClassLoadError(module, name); > > + } > > + }; > > } > > > > // We should never reach this point. > > @@ -3272,4 +3278,4 @@ > > > > return sb.toString(); > > } > > -} > > \ No newline at end of file > > +} > > > > although lazy construction might cause problems if people hold onto > > the exception for a long time, but I don't think this is usually the > case > > > > > > > > I know the design of the JBI classloaders is not really a good fit in > > > OSGi, so I will investigate > > > a better solution (leveraging more of OSGi classloaders) anyway, but > I > > > still wanted to report > > > the problem. > > > > > > > > > -- > > > Cheers, > > > Guillaume Nodet > > > ------------------------ > > > Blog: http://gnodet.blogspot.com/ > > > > > > > > > > > -- > > Cheers, Stuart > > > > > > > -- > > Cheers, > Guillaume Nodet > ------------------------ > Blog: http://gnodet.blogspot.com/ > -- Cheers, Stuart