graal java
重要要点
- Java的C2 JIT编译器报废
- 新的JVMCI编译器接口允许插入新的编译器
- Oracle已经开发了用Java编写的JIT Graal,作为预期的替代产品。
- Graal也可以独立工作,并且是新平台的主要组成部分
- GraalVM是支持多种语言(不仅仅是编译为JVM字节码的语言)的下一代多语言VM。
Oracle的Java实现基于开放源代码OpenJDK项目,其中包括HotSpot虚拟机,该虚拟机自Java 1.3以来就存在。 HotSpot包含两个单独的JIT编译器,称为C1和C2(有时称为“客户端”和“服务器”),现代Java安装在正常程序执行期间使用两个JIT编译器。
Java程序以解释模式启动。 在执行了一点之后,便会识别并编译经常调用的方法-首先使用C1,然后,如果HotSpot检测到更多的调用,则将使用C2重新编译该方法。 该策略称为“分层编译”,是HotSpot的默认方法。
对于大多数Java应用程序而言,这意味着C2编译器是环境中最重要的部分之一,因为它会生成与程序最重要的部分相对应的经过高度优化的机器代码。
由于运行时优化对于gcc或Go编译器这样的AOT编译器不可用,C2取得了巨大的成功,并且可以产生与C ++竞争(或比C ++更快)的代码。
但是,近年来C2的收益一直在下降,并且最近几年在编译器中未实现任何重大改进。 不仅如此,C2中的代码也变得很难维护和扩展,并且对于任何新工程师来说,要加快使用C ++特定方言编写的代码库的难度都非常困难。
实际上,(Twitter之类的公司以及Cliff Click之类的专家)普遍认为,当前的设计不可能再进行其他重大改进。 这意味着C2的任何剩余改进都将是微不足道的。
最近发行版中唯一得到改进的领域之一是使用了更多的JVM内在函数,该文档中描述了一种技术(针对@HotSpotIntrinsicCandidate注释),如下所示:
如果HotSpot VM用手写的程序集和/或手写的编译器IR(一种提高性能的编译器)替换了带注释的方法,则该方法将引起人们的兴趣。
JVM启动时,将对其执行的处理器进行探测。 这使JVM可以准确查看CPU可用的功能。 它建立一个特定于使用中的处理器的内在函数表。 这意味着JVM可以充分利用硬件的功能。
这与AOT编译不同,后者必须针对通用芯片进行编译,并对可用的功能进行保守的假设,因为如果AOT编译的二进制文件试图运行运行时CPU所不支持的指令,则会崩溃。
HotSpot已经支持许多内部函数-例如,众所周知的Compare-And-Swap(CAS)指令,用于实现原子整数之类的功能。 在几乎所有现代处理器上,这都是使用单个硬件指令来实现的。
JVM预先了解内部特性,并且依赖于操作系统或CPU体系结构的特定功能所支持。 这使得它们特定于平台,并且并非每个平台都支持所有内部函数。
通常,应将内在函数视为点修复,而不是一般技术。 它们具有功能强大,轻巧和灵活的优点,但由于必须在多个体系结构之间进行支持,因此具有潜在的高昂开发和维护成本。
因此,尽管内在函数取得了进展,但就所有意图和目的而言,C2均已到达生命周期的尽头,必须予以替换。
Oracle公司最近宣布了第一版GraalVM ,这是一个研究项目,可能会导致其最终替代HotSpot。
对于Java开发人员,可以将Graal视为几个独立但相互连接的项目-它是HotSpot的新JIT编译器,也是新的多语言虚拟机。 我们将JIT编译器称为Graal,将新VM称为GraalVM。
Graal工作的总体目标是重新考虑Java编译的工作方式(对于GraalVM也适用于其他语言)。 Graal的基本观察非常简单:
Java的(JIT)编译器将字节码转换为机器代码-用Java来讲,这只是从 |
事实证明,用Java编写编译器有一些主要优点,例如:
- 新的编译器工程师的入门门槛更低
- 编译器中的内存安全
- 能够利用成熟的Java工具空间进行编译器开发
- 新的编译器功能的原型制作速度更快
- 编译器可以独立于HotSpot
- 编译器将能够自行编译,从而生成一个更快的,由JIT编译的版本
Graal使用新的JVM编译器接口(JVMCI,以JEP 243的形式提供)插入HotSpot,但它也可以用作GraalVM的主要部分。该技术已经存在并在今天发售,尽管在Java 10中它仍然非常多一种实验技术,可以使用新的JIT编译器的开关是:
-XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler
这意味着我们可以通过三种不同的方式来运行一个简单的程序-使用常规的分层编译器,或者使用Java 10上的Graal的JVMCI版本,最后使用GraalVM本身。
为了看到Graal的效果,让我们使用一