[13] RFR(S) 8226566: [JVMCI] java.* classes are no longer necessarily resolved by the boot class loader

dean.long at oracle.com dean.long at oracle.com
Mon Jun 24 18:40:43 UTC 2019


The code isn't restricted to just java.* anymore.  Now it's any type 
that the platform classloader defines.  Isn't it possible that the class 
was resolved by the platform classloader, but accessingClass has a 
custom classloader that throws ClassNotFound?

dl

On 6/22/19 4:25 AM, Doug Simon wrote:
>
>> On 22 Jun 2019, at 01:14, dean.long at oracle.com 
>> <mailto:dean.long at oracle.com> wrote:
>>
>> Doesn't this assume that the classloader for accessingClass is 
>> well-behaved and delegates to the classloader for Object?  If the 
>> classloader is not well-behaved, is it safe to return true here?
>
> I don’t think it's possible for anything but the boot or platform 
> class loader to load java.* classes:
>
> https://github.com/openjdk/jdk13/blob/master/src/java.base/share/classes/java/lang/ClassLoader.java#L891-L899
>
> I’ve tested this:
>
> public class Main extends ClassLoader {
> @Override
> protected Class<?> findClass(String name) throws ClassNotFoundException {
> byte[] b = {};
> return defineClass(name, b, 0, b.length);
>   }
>
> @Override
> protected Class<?> loadClass(String name, boolean resolve) throws 
> ClassNotFoundException {
> return findClass(name);
>   }
>
> public static void main(String[] args) throws Throwable {
>       Main cl = new Main();
> for (String name : args) {
> try {
>               System.out.printf("%s: loader = %s%n", name, 
> Class.forName(name).getClassLoader());
>               System.out.println(Class.forName(name, true, cl));
>           } catch (Exception e) {
> e.printStackTrace();
>           }
>       }
>   }
> }
>
> > java -version
> java version "11.0.3" 2019-04-16 LTS
> Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
> Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)
> > java Main java.lang.Boolean java.sql.Array
> java.lang.Boolean: loader = null
> java.lang.SecurityException: Prohibited package name: java.lang
> at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:898)
> at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1014)
> at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:877)
> at Main.findClass(Main.java:5)
> at Main.loadClass(Main.java:10)
> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
> at java.base/java.lang.Class.forName0(Native Method)
> at java.base/java.lang.Class.forName(Class.java:398)
> at Main.main(Main.java:18)
> java.sql.Array: loader = 
> jdk.internal.loader.ClassLoaders$PlatformClassLoader at 47d384ee
> java.lang.SecurityException: Prohibited package name: java.sql
> at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:898)
> at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1014)
> at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:877)
> at Main.findClass(Main.java:5)
> at Main.loadClass(Main.java:10)
> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
> at java.base/java.lang.Class.forName0(Native Method)
> at java.base/java.lang.Class.forName(Class.java:398)
> at Main.main(Main.java:18)
>
>> What happens if we just remove the special case for 
>> java.lang.Object's classloader?  Does it hurt performance?
>
> It avoids a VM call for resolving all boot classes during compilation. 
> We could also avoid the VM call for when resolving platform classes as 
> well but I’m not sure how to get a ResolvedJavaType for a platform class.
>
> I don’t recall the measurements on the performance impact of this 
> optimization. Maybe it doesn’t show up. However, in libgraal VM calls 
> are relatively more expensive so seems like its worth keeping this 
> shortcut.
>
> -Doug
>
>>
>> On 6/21/19 3:47 PM, Vladimir Kozlov wrote:
>>> https://cr.openjdk.java.net/~kvn/8226566/webrev.00/
>>> https://bugs.openjdk.java.net/browse/JDK-8226566
>>>
>>> Doug proposed the fix. I tested it.
>>>
>>> Thanks,
>>> Vladimir
>>
>



More information about the hotspot-compiler-dev mailing list