松露上的Java –完全元循环

2021-01-20 12:15:37

到目前为止,GraalVM提供了两种运行Java程序的方法:将Java HotSpot VM与GraalVM JIT(即时)编译器一起使用,以及使用GraalVM Native Image编译为本机可执行文件。

今天,我们很高兴地宣布一种在GraalVM上运行Java的新方法。 GraalVM 21.0引入了一个名为espresso的新可安装组件,该组件提供了用Java编写的JVM实现。

Espresso可以通过Truffle框架运行Java代码,从而将Java提升到GraalVM支持的其他语言级别。

在Truffle上尝试Java非常简单。它可以作为组件使用gu命令安装到基本GraalVM发行版中。

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

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

请注意,目前Truffle上Java的原始性能并不能代表其在不久的将来将具有的功能。峰值性能比通常的JIT模式下运行相同的代码要低好几倍。预热也尚未优化。在此初始发行版中,我们完全专注于功能,兼容性以及使Truffle上的Java开源可用于更广泛的社区。

在我们即将发布的每个21.x版本中,预期性能(预热和峰值性能)都会迅速提高。

现在,让我们详细了解什么是Truffle上的Java,探索一些可以帮助您的著名用例,并尝试将项目放入更大的GraalVM和Java生态系统中。

Truffle上的Java是使用Truffle语言实现框架实现的JVM。它提供了Java虚拟机的所有核心组件:

此实现的一个非常重要的细节是它是用Java实现的。松露上的Java是Java上的Java!自我托管是Java虚拟机研发的圣杯。

它可以做的是运行Java程序。好吧,当然也可以使用其他JVM语言编写的程序。从上面的列表中可以看到,它还支持调试协议,因此您也可以使用它调试Java应用程序。

Truffle上的Java可用于基于Java 8和Java 11的GraalVM发行版,因此从技术上讲,您可以将其用作您选择的JVM的替代品。 Truffle上的Java目前仍处于试验阶段,还不是很快,因此不建议在今天的生产工作负载中使用,但让我们探索一下在Truffle上使用Java运行应用程序可以得到什么。

如前所述,松露上的Java是用Java实现的。这是一种虚拟机实施,因此,要真正运行Java代码,需要访问JDK提供的类库以及本机库和方法。松露上的Java重用了GraalVM发行版中的JAR和本机库。

用Java实现并能够运行Java使得Truffle上的Java具有非常有趣的特性:它可以自行运行。的确,Truffle上的Java是一个元循环VM,它可以在多个层次上运行(尽管每次运行的速度越来越慢)。以前曾尝试实现实用的Java on Java实现,

成为Java程序有许多优点。其中一项功能是可以使用本机映像编译为本机可执行文件,我们将在下一章中探讨一个有趣的用例。

另一个好处是该代码很好,对Java开发人员熟悉且易于理解。考虑进入GitHub存储库并查看其源代码。您的日常工具都可以使用它,IDE支持它,您可以像浏览其他Java依赖一样探索代码库。这种透明性和熟悉性应该使Truffle上的Java能够快速有效地变得更好。

Truffle上的Java是实际的JVM,它也是一个Java程序,这意味着您可以在另一个Java程序中运行它。这为将应用程序中的不同组件分隔开了非常有趣的途径。例如,如果将Truffle上的Java指向JDK11发行版,则它可以运行Java11。访问Java 8时,它将变为Java8。当两个发行版都可用时,可以在Java 8的上下文中在Truffle上运行Java。应用程序并使用它来运行Java 11字节代码,反之亦然。如果有一个仅适用于Java 8的库,则您可以迁移到较新的基本JDK,并通过一些编程工作来在兼容的JDK 8中以相同的Java流程运行该特定库。

由于Truffle上的Java,Truffle,GraalVM编译器以及在Truffle上有效运行Java的所有其他必要组件都是用Java编写的,因此可以使用在Truffle上运行Java的基础结构来构建本机映像可执行文件。

这意味着您可以使用Java应用程序,在其中构建JVM,然后在JVM上或作为本机映像运行该应用程序。请注意,在后一种情况下,Truffle上的Java实际上可以执行任意Java代码,而这些Java代码在构建时不一定是必须的。

没错,Java on Truffle可以将JIT编译器和动态Java运行时带到预先编译的二进制文件中。

我们准备了一个示例应用程序来说明此概念。有一个JShell实施示例,其中包含一个普通的JShell应用,该应用由两个独立的部分组成:前端CLI应用和后端计算引擎,并用Truffle上的Java替换后者。

实际上,通过加载它们,可以非常巧妙地重用原始实现中的所有类。因此,示例应用程序的原始部分是“胶水”代码,该代码将主机Java部分连接到应用程序的Truffle上的Java部分。

该示例可以作为本机可执行文件进行编译,由于本机可执行文件的性能特点,它可以以比正常JShell更快的速度启动一个不错的二进制文件,并且仍然可以执行我们扔给它的Java代码。

这是从在Truffle上使用Java实现的JShell加载并启动的俄罗斯方块游戏的屏幕截图。

对于无法利用本机映像性能改进的应用程序而言,将AOT和JIT混合是一种引人入胜的选择,因为它们的功能取决于动态代码,而动态代码不适用于本机映像。

Truffle上的Java比HotSpot更强大的另一个非常酷的功能是增强的热交换功能-在调试会话期间在运行时更改类。

使热插拔更加强大的是对类字段进行更改的能力。它正在开发中,并将在以后的版本中添加。

设置与HotSpot相同:启动调试器,更改代码,重新编译类,在IDE调试器中单击“重新加载类”,并在下次使用更改后的类时使用新代码恢复程序。

Truffle上的Java受益于GraalVM语言从Truffle框架获得的开发人员工具支持。

例如,您可以使用一些java -truffle --cpusampler运行应用程序,并在代码上运行采样分析器。您可以启用跟踪分析器或内存跟踪器,以告诉您代码的哪些部分比其他部分产生更多的内存压力。

生态系统的另一个方面是受支持的语言。松露上的Java允许您创建以多种语言编写不同组件的多语言程序。与如何加载用其他语言编写的代码,在语言之间导出和导入对象等有关的细节比当前文章的范围要复杂得多,但是可以从文档中找到细节。

GraalVM 21.0是Truffle上Java的初始版本。目前,这是一个实验性组件,计划在即将发布的版本中对其进行重大改进。

从支持javaagents到使用其他语言更好地实现interop协议,改进主要性能等等,有许多事情需要改进。

我们将努力进行这些改进和其他改进,并且非常高兴听到所有反馈,功能请求,潜在用例,发现的问题以及当前版本的缺点。您可以通过Slack,GitHub或Twitter分享您的反馈。首先,请访问graalvm.org/java-on-truffle。

松露上的Java是一种运行Java代码的非常令人兴奋的新方法。 看看并考虑可能性!