I've raised a JIRA with a patch that should accomodate this problem. I must admit this is not the cleanest thing, but given a 95% performance boost in my case I'd be happy it it is included :-) See https://issues.apache.org/jira/browse/FELIX-500
On Mon, Feb 25, 2008 at 5:05 PM, Guillaume Nodet <[EMAIL PROTECTED]> wrote: > I suppose we could make the ClassNotFoundException class a static class, give > it > a transient reference to the IModule and make sure the message is extracted > when > the Exception is serialized. > Thoughts ? > > > > On Mon, Feb 25, 2008 at 4:47 PM, Dale Peakall <[EMAIL PROTECTED]> wrote: > > These patches do have the problem that exceptions are supposed to be > > Serializable - and IModule is not Serializable. I don't know if the > > information necessary to construct the message is Serializable and can > > be quickly extracted from the module definition - given the apparent > > run-time cost of the method I suspect not. > > > > > > > > Stuart McCulloch wrote: > > > 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, > Guillaume Nodet > ------------------------ > Blog: http://gnodet.blogspot.com/ > -- Cheers, Guillaume Nodet ------------------------ Blog: http://gnodet.blogspot.com/