aot bug with multiple class loaders

蒯微(麦庶) kuaiwei.kw at alibaba-inc.com
Mon Jul 9 07:05:52 UTC 2018


Hi,
  Recently I tested aot feature in jdk10 and I think there's a bug in aot when aot method access classes from multiple class loaders.

  When a class is loaded, jvm try to iterate all aot code cache to find if it's a defined symbol of shared library. But it doesn't check class loader carefully, so a class in aot cache could incorrectly access class data in another loader . Please check my test case.

cat sub1/T1.java
public class T1{
  public int xadd(int a,int b){
    int r=a+b+T2.foo;
    System.out.println(r);
    return r;
  }
}
cat sub1/T2.java
public class T2{
  public static int foo=300;
  public static void change(int newVal) {foo=newVal;}
}

compile them in sub1 directory and make a copy as sub2. Create a aot library for T1.class
jaotc --output aot.so T1.class

put the aot.so into project directory and create a test file

cat Main.java

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Main{
    public static void main(String[] args)throws Exception{
        File file1=new File("./sub1");
        File file2=new File("./sub2");
        URL url1 = file1.toURI().toURL();
        URL url2 = file2.toURI().toURL();
        changeT2(url1);  // run with loader1
        run(url2);            // run with loader2
    }
    public static void changeT2(URL url) throws Exception{
        URL [] urls={url};
        URLClassLoader ucl = new URLClassLoader(urls);
        Class<?> c2 = ucl.loadClass("T2");
        Constructor<?> conc = c2.getConstructor();
        Object obj = conc.newInstance();
        Method m = c2.getMethod("change", int.class);
        m.invoke(obj, 0); // change T2.foo=0
    }
    public static void run(URL url) throws Exception{
        URL [] urls={url};
        URLClassLoader ucl = new URLClassLoader(urls);
        Class<?> c1 = ucl.loadClass("T1");
        Constructor<?> conc = c1.getConstructor();
        Object obj = conc.newInstance();
        Method m = c1.getMethod("xadd", int.class, int.class);
        m.invoke(obj, 0, 0);
    }
}

The whole project is like this:
> ls -l *
-rw-r--r-- 1 kuaiwei.kw users 108329 Jul  9 14:55 aot.so
-rw-r--r-- 1 kuaiwei.kw users   1613 Jul  9 14:55 Main.class
-rw-r--r-- 1 kuaiwei.kw users   1241 Jul  9 14:55 Main.java
sub1:
total 16
-rw-r--r-- 1 kuaiwei.kw users 398 Jul  9 14:55 T1.class
-rw-r--r-- 1 kuaiwei.kw users 118 Jul  9 14:55 T1.java
-rw-r--r-- 1 kuaiwei.kw users 321 Jul  9 14:55 T2.class
-rw-r--r-- 1 kuaiwei.kw users 103 Jul  9 14:55 T2.java
sub2:
total 16
-rw-r--r-- 1 kuaiwei.kw users 398 Jul  9 14:55 T1.class
-rw-r--r-- 1 kuaiwei.kw users 118 Jul  9 14:55 T1.java
-rw-r--r-- 1 kuaiwei.kw users 321 Jul  9 14:55 T2.class
-rw-r--r-- 1 kuaiwei.kw users 103 Jul  9 14:55 T2.java
run without aot
> java Main
300

run with aot
> java -XX:+UseAOT -XX:AOTLibrary=./aot.so Main
0

Best Regards,
Kevin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20180709/02de1eac/attachment.html>


More information about the hotspot-compiler-dev mailing list