原标题:GraalVM – an introduction to the next level JVM

随着Red Hat宣布Quarkus作为…

为GraalVM和HotSpot量身定制的下一代Kubernetes原生Java框架,使用一流的Java库和标准构建

https://quarkus.io

Red Hat展示的Quarkus示例项目的启动速度和内存消耗给我留下了深刻的印象。令人印象深刻的主要原因之一是,代码是用GraalVM提前(ahead-of-time,AOT)编译成本机映像(native image)的。为了帮助您更好地了解传统的HotSpot JVM和GraalVM之间的区别,我将在此博客文章中向您介绍GraalVM及其功能和历史。

TL; DR:GraalVM是Oracle开发的用纯Java编写的JVM扩展,支持多语言编程和提前编译。

HotSpot Java虚拟机的历史

多年来,HotSpot是Oracle维护和分发的主要Java虚拟机,用于运行Java程序。 Java HotSpot Performance Engine于1999年发布,最初由Animorphic开发,该公司被Sun Microsystems收购,现在由Oracle拥有。该虚拟机主要用C / C ++编写,并且变得越来越复杂(2007年估计有250.000行代码)。

HotSpot JVM的主要目的是运行Java字节码(.class文件)并持续分析程序的性能,以查找程序中经常执行的所谓热点,并即时(JIT,全称just-in-time)将其编译为本机代码(机器代码)以提高性能。这是在运行时完成的,而不是在Java程序执行之前执行的,因此是即时(just-in-time)的。

在HotSpot JVM中运行Java代码的工作流程如下所示(简化):

HotSpot虚拟机主要解释程序提供的Java字节码,但在程序运行过程中发现有适合优化的部分时,也会及时将这部分字节码编译为机器代码。

当使用JIT编译器编译一个方法时,当该方法被调用时,jvm将直接执行编译出来的机器码,而不是解释它以此来提高性能。由于编译本机代码需要CPU时间和内存,JVM必须在运行时决定编译哪些方法,因为将所有方法直接编译为本机代码会影响性能。

Java 9发行版中的更改

借助Java 9,特别是JEP 295,JDK获得了提前(ahead-of-time,AOT)编译器jaotc。该编译器使用OpenJDK项目Graal进行后端代码生成,这样做的原因如下:

JIT编译器速度很快,但是Java程序可能非常庞大,以至于JIT完全预热需要很长时间。很少使用的Java方法可能根本不会被编译,由于重复的解释调用可能会导致性能下降

https://openjdk.java.net/jeps/295

Graal OpenJDK项目演示了用纯Java编写的编译器可以生成高度优化的代码。使用此AOT编译器和Java 9,您可以提前手动编译Java代码。这意味着在执行之前生成机器代码,而不是像JIT编译器那样在运行时生成代码,这是第一种实验性的方法。

# using the new AOT compiler (jaotc is bundeled within JDK 9 and above)
jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base # with Java 9 you have to manually specify the location of the native code
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

这将改善启动时间,因为JIT编译器不必拦截程序的执行。这种方法的主要缺点是生成的机器代码依赖于程序所在的平台(Linux,MacOS,windows...)。这可能导致AOT编译代码与特定平台绑定。

GraalVM的架构

基于Graal编译器,Oracle开始开发GraalVM,不仅与HotSpots JVM的复杂C/C++代码库一起工作,而且还可以通过用Java编写的虚拟机解决当前的多语言迁移问题。

GraalVM的架构如下所示:

首先,您可能会注意到一些非JVM语言的存在。现在可以在这个通用虚拟机中运行Ruby、R或JavaScript代码。只是因为GraalVM采用了Truffle框架。Truffle是一个开源库,用于构建编程语言实现,作为自修改(self-modifying)抽象语法树的解释器。有了这个特性,您现在可以在Java代码库中编写和执行例如JavaScript代码。

此外,GraalVM提供了以下功能,可以提前将程序编译成本机可执行文件:

GraalVM允许您提前将程序编译为本地可执行文件。生成的程序不能在Java HotSpot VM上运行,而是使用必要的组件,例如内存管理,来自另一种虚拟机实现的线程调度(称为Substrate VM)。SubstrateVM用Java编写,然后编译进本地可执行文件。与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销。

https://www.graalvm.org/docs/reference-manual/aot-compilation/

使用GraalVM编译并运行第一个Java程序

撰写本文时,GraalVM有两个版本:社区版(CE)和企业版(EE),仅适用于Mac OS X和Linux。要在开发过程中在Windows上使用GraalVM,您可以使用Oracle的官方Docker映像,以下示例中使用了该映像。

想象下面的简单HelloWorld类:

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

在GraalVM和Java 9的AOT编译器之前,您执行了如下代码:

$ javac HelloWorld.java
$ java HelloWorld
Hello World!

借助GraalVM,您现在可以选择使用现有方式(HotSpot JVM)运行应用程序,或者使用GraalVM AOT编译器创建本机映像并运行可执行文件:

$ javac HelloWorld
$ native-image HelloWorld
$ ./helloworld
HelloWorld!

在这个HelloWorld示例中,改进的性能是微不足道的,但是在更大和更现实的应用程序中,性能的改进是显著的。

在官方的GraalVM入门指南中可以找到一个简单的多语言应用程序示例:

import java.io.*;
import java.util.stream.*;
import org.graalvm.polyglot.*; public class PrettyPrintJSON {
public static void main(String[] args) throws java.io.IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.lines().collect(Collectors.joining(System.lineSeparator()));
try (Context context = Context.create("js")) {
Value parse = context.eval("js", "JSON.parse");
Value stringify = context.eval("js", "JSON.stringify");
Value result = stringify.execute(parse.execute(input));
System.out.println(result.asString());
}
}
}

这个Java类负责漂亮地打印JSON,使用JavaScript方法JSON.parse() 和JSON.stringify() 。此类的本机镜像可通过如下方式构建:

$ javac PrettyPrintJSON.java
$ native-image --language:js PrettyPrintJSON
$ ./prettyprintjson < prettyMe.json
{
"GraalVM": {
"description": "Language Abstraction Platform",
"supports": [
"combining languages",
"embedding languages",
"creating native images"
],
"languages": [
"Java",
"JavaScript",
"Node.js",
"Python",
"Ruby",
"R",
"LLVM"
]
}
}

现在可以测量运行本机映像和在HotSpot中运行应用程序之间的性能差异:

$ time bin/java PrettyPrintJSON < prettyMe.json > /dev/null
real 0m1.101s
user 0m2.471s
sys 0m0.237s $ time ./prettyprintjson < prettyMe.json > /dev/null
real 0m0.037s
user 0m0.015s
sys 0m0.016s

在我看来,Oracle和GraalVM在Java作为编程语言的主导地位方面做得非常好。此外,这一举措提高了Java语言本身的可持续性和特性开发。有了多语言体系结构,这也增加了其他编程语言的采用。

您可以在我的GitHub存储库中找到示例,然后直接在GraalVM上(Mac和Linux)或在Windows上的Docker上(确保为Docker提供至少6 GB的RAM和2-4个内核)进行尝试。

原文地址:https://rieckpil.de/whatis-graalvm/


欢迎访问笔者博客:blog.dongxishaonian.tech

关注笔者公众号,推送各类原创/优质技术文章 ️

【译】GraalVM—下一代JVM介绍的更多相关文章

  1. JVM 介绍

    JVM 介绍: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 ...

  2. [译]深入理解JVM

    深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java ...

  3. [译]Java 垃圾回收介绍

    说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Introduction 在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的. ...

  4. JVM介绍&自动内存管理机制

    1.介绍JVM(Java Virtual Machine,Java虚拟机) JVM是Java Virtual Machine的缩写,通常成为java虚拟机,作为Java可以进行一次编写,到处执行(Wr ...

  5. Java虚拟机------JVM介绍

    Java平台和语言最开始只是SUN公司在1990年12月开始研究的一个内部项目: Java的平台无关性 Java平台和语言最开始只是SUN公司在1990年12月开始研究的一个内部项目[stealth ...

  6. JVM介绍(二)

    1 JVM简介 JVM是我们Javaer的最基本功底了,刚开始学Java的时候,一般都是从“Hello World”开始的,然后会写个复杂点class,然后再找一些开源框架,比如Spring,Hibe ...

  7. 【转】[译]深入理解JVM

    http://www.cnblogs.com/enjiex/p/5079338.html 深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/un ...

  8. JVM介绍(一)

    JVM是运行在操作系统之上的,它与硬件没有直接的交互 类装载器ClassLoader 负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的 ...

  9. 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

    微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔 ...

随机推荐

  1. vc6.0的项目如何在整个项目中查询内容呢?试试vs2015

    vc6.0的项目如何在整个项目中查询内容呢?试试vs2015 https://blog.csdn.net/txwtech/article/details/101308795

  2. Redis源码阅读一:简单动态字符串SDS

    源码阅读基于Redis4.0.9 SDS介绍 redis 127.0.0.1:6379> SET dbname redis OK redis 127.0.0.1:6379> GET dbn ...

  3. Beta冲刺<5/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第五天(05.23) 作业正文 如下 其他参考文献 ... B ...

  4. Java 14带来了许多新功能

    本文是作者翻译自java magazine的文章,我也将回持续的关注java的最新消息,即时和大家分享.如有翻译不准确的地方,欢迎大家留言,我将第一时间修改.   Java 14包含比前两个发行版更多 ...

  5. Spring Cloud面试题万字解析(2020面试必备)

    1.什么是 Spring Cloud? Spring cloud 流应用程序启动器是 于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成.Spring cloud Tas ...

  6. yum 安装JDK

    系统:CentOS 7 查看当前系统是否已安装JDK yum list installed |grep java 如果没有就选择yum库中的包进行安装,查看yum库中JDK列表 yum -y list ...

  7. junit搭建自动化测试框架(一)

    这里主要使用Junit搭建一个分层的自动化测试框架.这就是一个有业务逻辑的单元测试的思想.灵活性很大,对测试人员的代码能力要求较高. 以登录QQ邮箱为例,数据源使用了集合接口Map.借鉴了MVC的思想 ...

  8. Typora及Markdown的介绍及使用

    Typora及Markdown的介绍及使用 Typora是一款免费的Markdown编辑器,Typora不像其他Markdown编辑器一样使用一边代码一边预览的方式,而是写完代码之后直接出效果,所见即 ...

  9. SDL软件安全读书笔记(一)

    # 如何应对当前的全球网络安全威胁? 开发安全漏洞尽可能少的软件,应该着眼于源头安全. 边界安全盒深度防御是重要的安全手段,但软件自身的安全是安全防护的第一关. 即使软件源头存在较少的漏洞,这些漏洞也 ...

  10. python server端并发聊天

    ---------------------------server.py---------------------import socketserver class MyServer(socketse ...