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.
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/