任何AOT编译器的真正杀手是:
Class.forName(...)
这意味着您不能编写涵盖 所有
Java程序的AOT编译器,因为仅在运行时存在有关程序特性的信息。但是,您可以在Java的子集上执行此操作,这是我认为gcj所做的。
另一个典型的例子是,如果发现JIT可以安全地在调用方法中直接内联诸如getX()之类的方法,并且可以将其撤消,即使程序员没有明确帮助,也可以将其撤消方法是最终的。JIT可以看到在正在运行的程序中没有重写给定的方法,因此在这种情况下可以将其视为最终方法。在下一次调用中可能会有所不同。
编辑2019年:Oracle引入了GraalVM,它允许在Java的一个子集(相当大的一个,但仍然是一个子集)上进行AOT编译,其主要要求是所有代码都可以在编译时使用。这允许Web容器的毫秒启动时间。



