gpt4 book ai didi

java - Java和.Net在JIT上有什么区别

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:10 24 4
gpt4 key购买 nike

我知道 Microsoft .NET 使用 CLR 作为 JIT 编译器,而 Java 有 Hotspot。它们之间有什么区别?

最佳答案

它们是非常不同的野兽。正如人们指出的那样,CLR 在执行一段 MSIL 之前先编译为机器代码。除了典型的死代码消除和内联私有(private)优化之外,这还允许它利用目标机器的特定 CPU 架构(尽管我不确定它是否这样做)。这也会对每个类造成影响(尽管编译器相当快,而且许多平台库只是 Win32 API 之上的一个薄层)。

HotSpot 虚拟机采用了不同的方法。它规定大部分代码很少执行,因此不值得花时间编译它。所有字节码都以解释模式开始。 VM 在调用点保留统计信息并尝试识别调用次数超过预定义次数的方法。然后,它使用快速 JIT 编译器 (C1) 仅编译这些方法,并在运行时交换方法(这是 HS 的特殊之处)。在 C1 编译的方法被多次调用后,相同的方法会被缓慢但复杂的编译器编译,并且代码会在运行中再次交换。

由于 HotSpot 可以在运行时交换方法,VM 编译器可以执行一些在静态编译代码中不安全的推测优化。一个典型的例子是单态调用的静态分派(dispatch)/内联(只有一个实现的多态方法)。如果 VM 发现此方法始终解析为同一目标,则会执行此操作。过去复杂的调用被简化为一些 CPU 指令保护,这些指令由现代 CPU 预测和流水线化。当保护条件不再为真时,虚拟机可以采用不同的代码路径,甚至可以退回到解释模式。根据统计数据和程序工作量,不同时间生成的机器码可能不同。许多这些优化依赖于程序执行期间收集的信息,如果您在加载类时编译一次,则不可能实现。

这就是为什么在对算法进行基准测试时需要预热 JVM 并模拟实际工作负载(倾斜的数据可能导致对优化的不切实际的评估)。其他优化有锁省略、自适应自旋锁、逃逸分析和堆栈分配等。

也就是说,HotSpot 只是虚拟机之一。 JRockit、Azul、IBM 的 J9 和 Resettable RVM,都有不同的性能配置文件。

关于java - Java和.Net在JIT上有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2506969/

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