gpt4 book ai didi

java - 即时编译——什么时候在 Java 中实际发生?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:10 25 4
gpt4 key购买 nike

最近我参加了一个关于Java效率的讨论。正如我所听到的,许多反对 Java 的论点是解释“非常耗时”,正因为如此,即使是简单的 Java 程序运行起来也比直接编译为机器代码的类似程序慢得多。

对此的回答是,Java 代码通常直接编译为机器代码,如果只有 JVM 计算,它会使程序比以标准方式解释时更快。

我的问题是:JVM 什么时候真正“决定”执行即时编译?使 JIT 比标准字节码解释更有效的标准是什么?我的意思是,编译本身需要一些时间,据我所知,这一切都应该在程序已经运行时发生?

最佳答案

这根据您的 JVM 及其设置而有很大差异。维基百科:

For example, Sun's Java Virtual Machine has two major modes—client and server. In client mode, minimal compilation and optimization is performed, to reduce startup time. In server mode, extensive compilation and optimization is performed, to maximize performance once the application is running by sacrificing startup time. Other Java just-in-time compilers have used a runtime measurement of the number of times a method has executed combined with the bytecode size of a method as a heuristic to decide when to compile.[4] Still another uses the number of times executed combined with the detection of loops.[5]

对于服务器模式下的 Vanilla HotSpot JVM 的粗略近似是,当 JVM 注意到某个方法已被多次调用(通常超过某个特定次数)时,JIT 就会发生。 (这就是 JVM 被称为“HotSpot”的原因——因为它识别并优化代码中的“热点”。)此时,JVM 知道一些事情:

  • 它知道这个方法值得花时间优化,因为它被调用了很多次。
  • 它非常了解这个函数的真实特性:
    • if if 语句的一个分支比另一个更常见,因此它可以改进 branch prediction
    • 如果例如传递给此方法的 List 通常是 ArrayList,因此它可以针对 ArrayList 的特定情况进行优化和内联。

请注意,如果您提前编译为机器代码,则不会有很多此类信息可用于优化——编译器无法提前知道哪些路径比其他路径更常见。但是,如果您等到获得真实数据后再进行优化,则可以做出更好的优化决策。

有关 JIT 功能的更多详细信息是 here .

关于java - 即时编译——什么时候在 Java 中实际发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18220837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com