我很喜欢将字节码编译为本机代码,但它不会重新引入安全问题吗?例如,它不是缺少运行时检查,例如检查数组边界吗?
好的,如果您编译受信任的 Java 代码,它可能不会做任何错误,但可能还有其他情况。
提前编译器没有理由不将正常的运行时检查包含到已编译的代码中。此外,如果它不这样做,那么它就不会创建一个与常规程序相匹配的提前程序。那将是一个错误。
已建立的 JDK 中的常规 Hotspot 即时编译器将字节码转换为本机代码。提前编译所做的是提前做好工作。通过向您展示可以配置 JDK11 使用的Graal JIT的代码,有一个关于即时工作如何工作的精彩视频。
通过提前运行编译器,您可以获得更快的启动时间和更小的内存占用。此时您可能无法获得像 JIT 编译器那样快速的代码,因为 JIT 编译器可以根据代码遇到的数据进行优化。提前编译器无法猜测永远不会遇到哪些代码路径。