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

您:

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

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

可以理解,有人可以帮助我,从而使我认识到Openjdk AOT编译器的局限性。

GhostCat向Monica C.致敬:

请参阅您链接到文档

当前的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;

当您检查源代码时,例如getContents() -那里没有lambda。

因此,编译失败的方法很可能是由于新的编译器“ 尚未准备好”成功编译任意 Java源代码而造成的!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Java编译器允许在throws部分中列出异常,而方法无法抛出该异常

为什么C#编译器无法优化简单的异步/等待方法

在这种情况下,编译器为什么无法解析实例方法的符号?

在这种情况下,编译器为什么无法解析实例方法的符号?

在这种情况下,编译器为什么无法解析实例方法的符号?

为什么VS 2015编译器无法在abs()实现中优化浮点数的分支?

为什么编译器无法在Haskell中为我们处理新类型?

C ++为什么编译器无法生成返回Lambda中捕获变量的const引用的代码

为什么CodeBlocks编译器无法识别我在C的头文件中声明的函数?

为什么编译器找不到超类的方法?

为什么编译器选择了错误的方法重载?

为什么编译器与继承中的命名空间冲突

为什么Java编译器没有优化平凡的方法?

为什么Java编译器11使用invokevirtual来调用私有方法?

为什么通过实例调用静态方法不是Java编译器的错误?

为什么java编译器在获取之前不检查列表参数中的对象类型?

为什么我的编译器会在Java中给我这两个错误?

为什么此C ++代码可以与某些编译器一起编译,而不与其他编译器一起编译?

抑制AOT编译器中的重复错误

为什么我的某些类名在新的VS 2015编译器中返回为“ <> c”?

什么是编译器隐式方法?

为什么此C ++程序在某些编译器中有效,但在其他编译器中无效?C ++编译器之间的主要区别是什么?

无法初始化编译器:在编译器镜像中找不到对象java.lang.Object

为什么Java编译器在以下代码中为LinkedListDescendingIterator给出“错误:找不到符号”?

当我在Java的静态块中声明接口时,为什么编译器会显示错误?

为什么Java编译器不报告Intellij中多播表达式的未经检查的强制转换警告?

在C ++中,为什么某些编译器拒绝将仅包含double的对象放入寄存器?

为什么在某些情况下,编译器生成的回报可达代码

为什么某些C编译器会在奇怪的地方设置函数的返回值?