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/

Reply via email to