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/

Reply via email to