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

cwe*_*wei 6 java jvm java-9

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

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

可以理解,有人可以帮助我,以便我可以实现Openjdk AOT编译器的限制.

Gho*_*ica 5

请参阅您要链接到的文档:

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

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

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

因此有两种可能的解释:

  1. 不编译的方法属于已知限制
  2. 否则,是"全新的,实验性"产品中的错误

最有可能"选项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;
Run Code Online (Sandbox Code Playgroud)

当你检查源代码时,例如getContents() - 那里没有lambdas.

因此,编译失败的方法很可能是因为新编译器" 尚未准备好"成功编译任意 Java源代码!