GraalVM 21.0提供运行Java代码的第三种方式 - graalvm


到目前为止,GraalVM提供了两种运行Java程序的方法:将Java HotSpot VM与GraalVM JIT(即时)编译器一起使用,以及第二种方法:使用GraalVM Native Image编译为本机可执行文件。
今天,我们很高兴地宣布一种在GraalVM上运行Java的新方法(第三种方法)。GraalVM 21.0引入了一个名为的新可安装组件,espresso该组件提供了用Java编写的JVM实现。
Espresso可以通过Truffle框架运行Java代码,从而将Java提升到GraalVM支持的其他语言级别。
在我们即将发布的每个21.x版本中,预期性能(预热和峰值性能)都会迅速提高。
现在让我们更详细地了解什么是Truffle上的Java,探索一些可以帮助您的显着用例,并尝试将项目放入更大的GraalVM和Java生态系统中。
 
Truffle上的Java是使用Truffle语言实现框架实现的JVM。它提供了Java虚拟机的所有核心组件:

  • 字节码解释器
  • 字节码验证器
  • 单遍.class文件解析器
  • 简单对象模型
  • Java中的Java本机接口(JNI)实现
  • Java虚拟机实现
  • Java调试线协议(JDWP)

此实现的一个非常重要的细节是它是用Java实现的。Truffle上的Java是Java上的Java!自我托管是Java虚拟机研发的圣杯。
Truffle上的Java可用于基于Java 8和Java 11的GraalVM发行版,因此从技术上讲,您可以将其用作您选择的JVM的替代品。Truffle上的Java目前仍处于试验阶段,还不是很快,所以今天不建议在生产工作负载上使用Java ,但是让我们探索一下在Truffle上使用Java运行应用程序可以得到什么。
 
Java on Java
Truffle上的Java是用Java实现的。这是一个虚拟机实现,因此,为了实际运行Java代码,需要访问类库以及JDK提供的本机库和方法。Truffle上的Java重用了GraalVM发行版中的JAR和本机库。
用Java实现并能够运行Java使得Truffle上的Java具有非常有趣的特性:它可以自行运行。的确,Truffle上的Java是一个元循环VM,它可以在多个层次上运行(尽管每次运行的速度越来越慢)。
成为Java程序有许多优点。其中之一是可以使用本机映像编译为本机可执行文件的能力
另一个优点是该代码是Java开发人员很好的,熟悉的并且可以理解的代码。考虑转到GitHub存储库并查看其源代码。您的日常工具都可以使用它,IDE支持它,您可以像浏览其他Java依赖一样探索代码库。这种透明性和熟悉性应该使Truffle上的Java能够快速有效地变得更好。
 
在Java8中嵌入运行Java11
Truffle上的Java是实际的JVM,它也是一个Java程序,这意味着您可以在另一个Java程序中运行它。这为将应用程序中的不同组件分隔开了非常有趣的途径。例如,如果将Truffle上的Java指向JDK11发行版,则它可以运行Java11。访问Java 8时,它将变为Java8。当两个发行版都可用时,可以在Java 8的上下文中在Truffle上运行Java。应用程序并使用它来运行Java 11字节代码,反之亦然。如果有一个仅适用于Java 8的库,则可以在同一Java流程中的兼容JDK 8中,通过一些编程工作来建立互操作性,从而迁移到较新的基本JDK并仍然运行该特定库。
 
混合AOT和JIT
由于Truffle上的Java,Truffle,GraalVM编译器以及在Truffle上有效运行Java的所有其他必要组件都是用Java编写的,因此可以使用在Truffle上运行Java的基础结构来构建本机映像可执行文件。
这意味着您可以使用Java应用程序,在其中构建JVM,然后在JVM上或作为本机映像运行该应用程序。
Java on Truffle可以将JIT编译器和动态Java运行时带到预先编译的二进制文件中。
我们准备了一个示例应用程序来说明此概念。有一个JShell实现示例,该示例采用一个普通的JShell应用程序,该应用程序由两个独立的部分组成:前端CLI应用程序和后端计算引擎,并用Truffle实现中的Java替换后者。
实际上,通过加载它们,可以非常巧妙地重用原始实现中的所有类。因此,示例应用程序的原始部分是“胶水”代码,该代码将主机Java部分连接到应用程序的Truffle上的Java部分。
该示例可以作为本机可执行文件进行编译,由于本机可执行文件的性能特点,它可以以比正常JShell更快的速度启动一个不错的二进制文件,并且仍然可以执行我们扔给它的Java代码。
对于无法利用本机映像性能改进的应用程序而言,将AOT和JIT混合是一个有趣的选择,因为它们的功能取决于动态代码,而动态代码不适用于本机映像。
 
高级类重新定义
Truffle上的Java比HotSpot更强大的另一个非常酷的功能是增强的热交换功能-在调试会话期间在运行时更改类。
从GraalVM 21.0开始,支持以下更改:
  1. 添加和删​​除方法
  2. 添加和删​​除构造函数
  3. 从接口添加和删除方法
  4. 更改方法的访问修饰符
  5. 更改构造函数的访问修饰符
  6. Lambdas的更改
  7. 添加新的匿名内部类
  8. 删除匿名内部类

使热插拔更加强大的是对类字段进行更改的能力。它正在开发中,并将在以后的版本中添加。
 
尝试使用
在Truffle上尝试Java非常简单。它可以作为可通过gu命令安装到基本GraalVM发行版中的组件使用。
gu install espresso 
gu install -L espresso-installable.jar#如果手动下载

安装完成后,您可以在Truffle上的Java上运行您喜欢的应用程序,您只需传递-truffle给java命令即可。
java -truffle -jar myApp.jar

在Truffle上下载Java并尝试一下!有一些示例应用程序,其说明说明了Truffle上Java的特定功能。