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