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. GitHub开源的10个超棒后台管理面板
  2. Nature子刊:整合宏基因组、代谢组和表型分析的的计算框架
  3. js中window.location.search的用法和作用
  4. Mysql:事务管理——未完待续
  5. Vue.js指令实例
  6. iOS Cookie学习(NSHTTPCookieStorage的使用)
  7. ROW_NUMBER() OVER() 函数用法详解 (分组排序,多例子)
  8. Python内置的字符串处理函数整理
  9. 最适合开发VR游戏大作的游戏引擎——Unity
  10. 【原创】通俗易懂地解决中文乱码问题(1) --- 跨平台乱码
  11. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)
  12. 【数据库课程设计】金融数据库设计与实现
  13. Android6.0内核移植(1):分析编译日志
  14. oracle 9i,10G,11G,各版本下载资源(使用迅雷),收集好久,分享上来!
  15. native2ascii
  16. Linux php5 curl 扩展
  17. VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程
  18. js登录界面使用ajax连接数据库,js用ajax连接数据库数据
  19. ADXL362 初次使用总结(使用stm32 HAL 库)
  20. virtualBox报错 0x80004005

热门文章

  1. (二)使用Ajax简单实现前后端交互
  2. 组播IP地址与组播MAC地址之间的换算方法
  3. Speedoffice(excel)设置按颜色进行排序
  4. 用友U8+ERP系统 用友ERP+智能制造 上海杰然软件
  5. 人际关系必知的55个绝招
  6. SQL之存储过程(procedure)
  7. 绿盟科技阮博男:从开源靶场看云原生安全
  8. SpyGlass工具介绍
  9. 出售中文版webgame程序,有后台,带商业功能,可演示
  10. Photoshop CS5画笔初学者必读(13)——历史记录画笔