导语: 虚拟机(VM)想必大家都非常了解和熟悉,例如JVM,但支持多语言的VM却未必熟悉。本文作者介绍了新一代高性能跨语言的虚拟机GraalVM,主要内容包括VM的特性、和JDK8、9的性能对比,比着重介绍了作者在试用native特性时遇到的问题。
上周Oracle发布了GraalVM [1]。如网站上所述:
高性能跨语言虚拟机
GraalVM是一种通用的虚拟机,用于运行JavaScript、Python 3、Ruby、R、基于JVM的语言,如Java、Scala、Kotlin和基于LLVM的语言,如C和C++。
GraalVM消除了编程语言之间的隔离,并支持共享运行时的互操作性。它可以独立运行,也可以在OpenJDK、Node、Oracle或者MySQL上运行。
有几个因素让人们想从正常的JRE转到Graal VM:
其中一个可能是它声称的改进的性能。
另一个可能是多语言特性,透明地混合和匹配支持的语言。
最后一个是前者的混合:在本地支持下,可以将Java应用程序作为本地代码。
作为一个极客,我想先快速地看一看。下面是我的一些使用体验。
是否用企业版?
第一步是下载Graal VM [2]。GraalVM有两个版本:
社区版
所有开源许可
免费供生产使用
企业版
测评和其他非生产用途免费使用
对于商业使用和支持选项,应该联系销售团队。
第一个比较惊讶的: 社区版本只能在Linux操作系统使用。对于OSX操作系统,只能使用企业版。目前还没有适用于Windows的版本。
Graal VM结构
Graal VM结构类似于传统的pre-9 Java JDK。
因此,GraalVM可以替代任何标准JDK。
运行 java –version输出结果如下:
PS: 到目前为止,GraalVM仅限于Java8功能。
一些性能基准
下一步是检查性能是否有改善。我使用JMH [3]框架来进行性能测试。
我使用以下代码:
使用java –jar target/benchmarks.jar命令分别在三个不同的JREs上进行测试。
GraalVM
Oracle JDK 8
Oracle JDK 9
总结:
通过数据可以得到:在性能方面,Graal VM和Java 8之间的差距并不显著。但它们和Java 9的差距比较明显。另外,Java 9有最高的标准偏差。
继续体验本地方法
GraalVM可以通过native-image命令将JAR转换为本地可执行文件。我尝试着用之前创建的JAR来测试。
native-image -H:+JNI -jartarget/benchmarks.jar
然而,在尝试运行新创建的二进制文件时,我遇到了下面的错误信息:
更糟糕的是,尝试为Spring Pet Clinic [4]创建本地镜像时,遇到下面的错误:
GraalVM不支持动态类加载。
我尝试了H2和HSQLDB的独立jar文件,但没有用。在这两种情况下,我得到了以下堆栈:
结论
GraalVM有很多很有前途的功能,包括多语言,尽管我现在对它不太感兴趣。然而,从我有限的使用体验来看,它仍然有改进的空间。性能方面,Graal VM要好于Java9。此外,本地方法镜像在目前的状况下,用处比较有限。恕我直言,它目前还处在MVP的阶段。我急切地等待下一个版本,希望他们能在上面的问题上有所改进。
了解更多:
GraalVM主页 [1]
-
GraalVMgithub [5]
参考链接
[1] http://www.graalvm.org/
[2] https://www.graalvm.org/downloads
[3] http://openjdk.java.net/projects/code-tools/jmh/
[4] https://github.com/nfrankel/spring-petclinic
[5] https://github.com/oracle/graal
活动预告:
6 月 1 ~ 2 日,GIAC 全球互联网架构大会将于深圳举行。GIAC 是高可用架构技术社区推出的面向架构师、技术负责人及高端技术从业人员的技术架构大会。今年的 GIAC 已经有腾讯、阿里巴巴、百度、今日头条、科大讯飞、新浪微博、小米、美图、Oracle、链家、唯品会、京东、饿了么、美图点评、罗辑思维、ofo、迅雷、旷视、LinkedIn、Pivotal 等公司专家出席。
本期 GIAC 大会上,微服务部分精彩的议题如下:
参加 GIAC,盘点2018最新技术。点击“阅读原文”了解大会更多详情。