Yes, this saves creating the type and wrapper object altogether, while testing suggest it's only the getResource() == null cases wecommonly seehurting startup in our tests. I'd say let's go with your patch.

New webrev: http://cr.openjdk.java.net/~redestad/8057936/webrev.4/

Benchmark referred to in bug (java -jar benchmarks.jar -f 4 -wi 5 -i 10 -p file=classes.jar)show
similar benefits (somewhere in the 4-12% range, statistically):

Benchmark (file) Mode Samples Score Score error Units
baseline:
o.o.ClassLoaderBenchmark.loadAll classes.jar avgt 40 0.679 0.037 s/op
patched:
o.o.ClassLoaderBenchmark.loadAll classes.jar avgt 40 0.598 0.007 s/op

/Claes

ps. I think lambdas give little or no benefit here, and as Alan points out it could lead to tricky
classloading bugs.

On 09/10/2014 01:21 PM, Michael McMahon wrote:
or how about just returning a null Class<?> from the privileged block
instead of the new result type only in the case where URLClassPath.getResource() returns null?
That's the main "normal" case where the resource doesn't exist, I think.

If defineClass() throws an IOException, then that is more likely to be a "genuine" exception

- Michael

diff --git a/src/java.base/share/classes/java/net/URLClassLoader.java b/src/java.base/share/classes/java/net/URLClassLoader.java
--- a/src/java.base/share/classes/java/net/URLClassLoader.java
+++ b/src/java.base/share/classes/java/net/URLClassLoader.java
@@ -356,8 +356,9 @@
     protected Class<?> findClass(final String name)
          throws ClassNotFoundException
     {
+    final Class<?> result;
         try {
-            return AccessController.doPrivileged(
+            result = AccessController.doPrivileged(
                 new PrivilegedExceptionAction<Class<?>>() {
public Class<?> run() throws ClassNotFoundException { String path = name.replace('.', '/').concat(".class");
@@ -369,13 +370,17 @@
throw new ClassNotFoundException(name, e);
                             }
                         } else {
-                            throw new ClassNotFoundException(name);
+                return null;
                         }
                     }
                 }, acc);
         } catch (java.security.PrivilegedActionException pae) {
             throw (ClassNotFoundException) pae.getException();
         }
+    if (result == null) {
+        throw new ClassNotFoundException(name);
+    }
+    return result;
     }

     /*

On 10/09/14 11:55, Ivan Gerasimov wrote:

If a lambda were used instead of an anonymous class, it would save us one line of code :-)

Sincerely yours,
Ivan

On 10.09.2014 14:11, Claes Redestad wrote:
Hi,

please review this simple patch to avoid raising PrivilegedActionExceptions
when failing to find a class in URLClassLoader.

 bug: https://bugs.openjdk.java.net/browse/JDK-8057936
 webrev: http://cr.openjdk.java.net/~redestad/8057936/webrev.2/
/Claes





Reply via email to