GraalVM是一个运行时平台,它支持Java和其他基于Java字节码的语言,但也支持其他语言,如JavaScript,Ruby,Python或LLVM。我们坚信,正如我们目前所知,它是语言虚拟机的未来。

但是,我们知道从已建立的Oracle JVM或OpenJDK切换到GraalVM是一个大胆的步骤,您可能不想完全采用它。但是,您可能希望在库存JVM上尝试GraalVM项目的一些很酷的功能。

​​​​​​在这篇博客文章中,我们将展示如何从示例Maven应用程序中使用GraalVM的JavaScript引擎。我们还展示了如何在OpenJDK 11库存中使用GraalVM的JavaScript引擎,包括Graal作为JIT(即时)编译器以获得更好的峰值性能。这样,GraalVM的JavaScript引擎可以用作已弃用的Nashorn JavaScript引擎的替代品。我们将在Maven应用程序上进行演示,因为Maven central上提供了所有必需的工件。

GraalVM的JavaScript和Graal编译器

可能出现的一个问题是:GraalVM的JavaScript引擎与Graal的关系是什么; 我可以只使用JavaScript引擎并省略Graal吗?

如果你这样做,事情就会完全奏效。然后,您可以解析并执行任何(有效的)JavaScript代码。GraalVM的JavaScript引擎是一个适用于任何Java 8+实现的Java应用程序。JavaScript执行是围绕抽象语法树(AST)解释器构建的,可以像任何其他Java应用程序一样执行。每个Java虚拟机都会在一定程度上对其进行优化,但JavaScript执行仍将被解释,因此速度很慢。

但是,Graal编译器有一些特殊的技巧可以将这个AST解释器转换为高度优化的机器代码。它将适应所执行的JavaScript应用程序,并将应用程序和解释器编译为机器代码,从而在运行时将其有效地转换为JavaScript编译器。在短暂的预热阶段之后,如果在启用了Graal编译器的JVM上执行GraalVM的JavaScript引擎,则JavaScript应用程序将实现接近本机的性能。

示例应用

我们准备了一个展示相关设置的示例应用程序。这个基于Maven的示例可以作为一个起点,使您能够将基于Nashorn的JavaScript应用程序传输到GraalVM的带有Graal支持的JavaScript。

该示例以JavaScript中的Prime数计算为中心,在Java代码中消费调用它。它展示了如何使用首选org.graalvm.polyglot接口访问GraalVM的JavaScript ,还使用javax.script(JSR 223 ScriptEngine)接口。此外,示例代码通过Nashorn引擎上的ScriptEngine执行(如果可用)。执行相同数量的预热和测量迭代并作为简单基准打印,显示相应引擎上所需的执行时间(较低的值更好)。

这个例子可以在GitHub上找到:

请注意,代码的特殊优点不是讨论的有趣部分,通常可以将Java和JavaScript源分成单独的文件等等。此示例主要关注用于执行多语言Java和JavaScript代码的基础结构。如果使用以下命令编译并执行它,应用程序应该是开箱即用的; 确保您使用JDK11 JAVA_HOME指向它。

export JAVA_HOME = / path / to / JDK11

mvn clean && mvn package && mvn exec:exec @ graal

这将确保您使用Graal进行GraalVM JavaScript代码的JIT编译。在这个应用程序中,当我们测量时,GraalVM的JavaScript大约是Nashorn的两倍(请试试你的机器,YMMV)。

为了便于比较,您可以在不启用Graal编译的情况下执行相同的基准测试:

mvn clean && mvn package && mvn exec:exec @nograal

在该模式下,在没有Graal作为JIT编译器的情况下执行,GraalVM / JavaScript的性能显着下降。

一些技术见解

现场背后发生了什么?在pom.xml文件中声明了相关包的几个依赖项,包括org.graalvm.compiler和org.graalvm.js。这些可以在Maven中心获得,并从那里下载。

将三个参数传递给JVM,如插件配置部分中所声明的,它在JVM上启用Graal编译:

-XX:+UnlockExperimentalVMOptions

此标志启用以下选项

-XX:+EnableJVMCI

通过JVMCI(Java虚拟机编译器接口)实现Java代码的编译

--upgrade-module-path

在模块路径上放置正确版本的Graal,以便它可以用作GraalVM / JavaScript的编译器

结论

在这篇文章中,我们研究了如何从Maven Central中使用GraalVM的JavaScript引擎工件并在库存JDK上运行它。如果不能访问Graal编译器,则此设置中的JavaScript代码性能可能不是最佳的 - 幸运的是,您可以使用一堆命令行选项启用Graal编译器,并获得更快的JavaScript执行速度。在Graal编译器的存在下,GraalVM的JavaScript明显快于Nashorn。

java nashorn_在JDK11上GraalVM的JavaScript性能是Nashorn的两倍相关推荐

  1. java 中文分词转拼音_java 支持分词的高性能拼音转换工具, 速度是 pinyin4j 的两倍...

    java 支持分词的高性能拼音转换工具, 速度是 pinyin4j 的两倍 pinyin https://github.com/houbb/pinyin 是 java 实现的高性能中文拼音转换工具. ...

  2. java监控数据库性能_Java:GraalVM数据库流性能

    java监控数据库性能 GraalVM是JVM块的新成员. 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript. GraalVM还具有一个新的内部代码优化器管道 ...

  3. Java:GraalVM数据库流性能

    GraalVM是JVM块的新成员. 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript. GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JV ...

  4. java script创建对象_javascript笔记:深入分析javascript里对象的创建

    大家知道在java里面类可以具有静态属性和方法,无需实例化该类的对象,就可以访问这些属性和方法,但是javascript里面是不是只有通过对象初始化方式才会模拟出这样的特点了?其实不然,在编程语言里, ...

  5. 深入理解java虚拟机JVM(上)

    深入理解java虚拟机JVM(上) 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App,操作更 ...

  6. JAVA——JAVA知识点集锦(上)

    转自:http://blog.csdn.net/scythe666/article/details/51994770 1.面向对象的特征有哪些方面?  答:面向对象的特征主要有以下几个方面:  - 抽 ...

  7. Java实现Nginx图片上传

    简介 文件上传功能,是信息系统开发中的常用功能,在传统的开发流程中,前端通过表单上传文件,后端进行文件处理.不利之处在于 后端需要写重复代码,每开发一个包含上传功能的系统,就需要写一遍上传逻辑. 当文 ...

  8. Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webst ...

  9. 想听世界上最懂 JavaScript 的人和你讲JavaScript 吗?

    时至今日,JavaScript 对前端工程师的重要性已无需多言.甚至有些同学已经达到了通读语言标准,对 ECMA-262 规范熟捻于心的水平. 然而即便如此,很多同学仍然将编程语言作为一种源自权威的. ...

最新文章

  1. libgdx和android界面结合,Android游戏引擎libgdx使用教程5:常用UI类与舞台
  2. 《大数据算法》一1.2 大数据算法
  3. Android中点击按钮获取string.xml中内容并弹窗提示
  4. oracle学习数据,Oracle从入门到精通的学习笔记
  5. MySQL操作之JSON数据类型操作详解
  6. 岁末年初3Q大战惊现高潮,360震撼推出Android 3Q IM即时通讯
  7. Nginx学习总结(14)——Nginx配置参数详细说明与整理
  8. JSTL中的Core标签库
  9. HDU 2602 Bone Collector - from lanshui_Yang
  10. javascript在IE下的格式问题
  11. FGSM实例:利用fgsm攻击RMB识别模型
  12. 什么是物联网数据采集网关?物联网数据采集网关的特点
  13. Java 9 : 从零开始实现模块化(一)
  14. 用python制作动态二维码印刷价格_用一行Python代码制作动态二维码
  15. 92套AE抖音快闪模板(精品)
  16. gwas snp 和_GWAS学习笔记4---SNP过滤
  17. 设计模式之六个创建型模式的相关知识,简单易懂。
  18. 【实习日记】Linux-VM15-Ubuntu18.04 + 运行selenium实现文件下载
  19. SQL——数据定义DDL
  20. Nodejs:ESModule和commonjs,傻傻分不清

热门文章

  1. 给我10个下期双色球易中奖号码
  2. html中的doctype有什么作用,HTML中doctype的作用及几种类型详解
  3. java开发选 e3v3 i5,【选CPU必看】i5、E3、i7之间的区别以及到底怎么选?干货!
  4. 今天,值得回忆的一天
  5. Java编写的 基于控制台的航班信息系统
  6. matlab里面q函数,标准正态分布的Q函数用 matlab 怎么写
  7. 期货乙烯一点多钱(期货聚乙烯一手几吨)
  8. 如何快速找出单词的变位词
  9. html转义字符xml工具,HTML,XML中的转义字符
  10. 关于计算机硬件的小技巧,电脑硬件的日常维护技巧