aot bug with multiple class loaders

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Jul 10 06:31:15 UTC 2018


Thank you, Kevin

Yes, this is Day One problem. I filed:

https://bugs.openjdk.java.net/browse/JDK-8206963

Regards,
Vladimir

On 7/9/18 12:05 AM, 蒯微(麦庶) wrote:
> 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


More information about the hotspot-compiler-dev mailing list