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