为什么java.base中的某些方法无法由AOT编译器编译

时间:2017-07-28 08:47:31

标签: java jvm java-9

根据JEP-295(http://openjdk.java.net/jeps/295

java.base中有一些方法会导致编译失败,但为什么呢?

我们将不胜感激,有人可以帮助我,以便我能够实现对Openjdk AOT编译器的限制。

1 个答案:

答案 0 :(得分:5)

请参阅您要关联的documentation

  

目前的AOT限制......

     

可能无法编译使用动态生成的类和字节码(lambda表达式,调用动态)的java代码。

     

这些限制可能会在将来的版本中得到解决。

因此有两个潜在的解释:

  1. 不编译的方法属于已知限制
  2. 否则,一个全新的,实验性的"产品
  3. 最有可能"选项2"是更好的解释 - 再次看到你的链接。

    它包含一系列编译失败的方法,以及发生的错误

    cat java.base-list.txt
    
    # jaotc: java.lang.StackOverflowError
    exclude sun.util.resources.LocaleNames.getContents()[[Ljava/lang/Object;
    exclude sun.util.resources.TimeZoneNames.getContents()[[Ljava/lang/Object;
    exclude sun.util.resources.cldr.LocaleNames.getContents()[[Ljava/lang/Object;
    exclude sun.util.resources..*.LocaleNames_.*.getContents\(\)\[\[Ljava/lang/Object;
    exclude sun.util.resources..*.LocaleNames_.*_.*.getContents\(\)\[\[Ljava/lang/Object;
    exclude sun.util.resources..*.TimeZoneNames_.*.getContents\(\)\[\[Ljava/lang/Object;
    exclude sun.util.resources..*.TimeZoneNames_.*_.*.getContents\(\)\[\[Ljava/lang/Object;
    # java.lang.Error: Trampoline must not be defined by the bootstrap classloader
    exclude sun.reflect.misc.Trampoline.<clinit>()V
    exclude sun.reflect.misc.Trampoline.invoke(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
    # JVM asserts
    exclude com.sun.crypto.provider.AESWrapCipher.engineUnwrap([BLjava/lang/String;I)Ljava/security/Key;
    exclude sun.security.ssl.*
    exclude sun.net.RegisteredDomain.<clinit>()V
    # Huge methods
    exclude jdk.internal.module.SystemModules.descriptors()[Ljava/lang/module/ModuleDescriptor;
    

    当您检查来源时,例如getContents() - 那里没有lambdas。

    因此,编译失败的方法很可能是由于新编译器已经尚未准备好&#34;成功编译任意 Java源代码!

相关问题