初探Oracle全栈虚拟机---GraalVM
官方说明:
GraalVM是一个生态系统和共享运行时,不仅提供基于JVM的语言(如Java,Scala,Groovy和Kotlin)的性能优势,还提供其他编程语言(如JavaScript,Ruby,Python和R)的性能优势。此外,它还支持通过LLVM前端在JVM上执行本机代码。GraalVM 1.0基于JDK 8。
上图说明了GraalVM作为开放式生态系统的体系结构。
虚拟化层代表GraalVM提供的编程语言。客户编程语言(即JavaScript,Ruby,R,Python和LLVM bitcode)在与基于主机JVM的应用程序相同的运行时中的执行现在是脚踏实地的。宿主语言和客户语言可以直接相互操作,并在同一存储空间中来回传递数据。
底部展示了适用范围。GraalVM既可以独立运行,也可以作为OpenJDK或node.js平台的一部分进行嵌入,甚至可以嵌入MySQL或Oracle RDBMS等数据库中。
GraalVM 1.0版本包含语言解释器:
- 基于JVM的语言,如Java,Scala,Groovy或Kotlin
- JavaScript(包括node.js)
- 编译为LLVM bitcode的语言,如C,C ++或Rust
- Ruby,R和Python的实验版本
GraalVM包括以下组件:
- Graal:一种动态即时(JIT)编译器,通过独特的代码分析和优化方法提高应用程序的效率和速度。
- Graal Polyglot API:用于在共享运行时中组合编程语言的API。这些API允许您根据需要匹配编程语言,并使用更少的资源为您提供更好的性能。
- Graal SDK:一组用于嵌入Graal语言和配置本机映像的API。
- Oracle HotSpot Java虚拟机(JVM):基于JVM的语言和支持的客户编程语言的运行时环境。
ShowTime:
配置篇:
看完了激动人心的介绍之后,我果断选择了前去尝试。作为一个重度java患者,对于Oracle的东西还是比较有兴趣的。下面是他的官网,长这个样子,总体来说,UI设计师还是不错的。至少我喜欢这个风格。
我们继续顺着首页向下看。官网以一段Node代码,向我们展示了,GraalVM的优越性,我们可以很明显的发现,在这段代码中我们兼容了3种不同的语言。为我们提供了极大的便利性。
接下来,我们介绍下,java方面的优化,GraalVM允许您提前将程序编译为本机可执行文件。生成的程序不在Java HotSpot VM上运行,而是使用必要的组件,如内存管理,来自虚拟机的不同实现的线程调度,称为Substrate VM。Substrate VM是用Java编写的,并编译成本机可执行文件。与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销。
这张图中我们,很明显的看到,java的编译时间被缩短了,14倍。当然这是它官方提供的数据。一切以我之后的测试数据为准。
说了这么多,越说越激动,我迫不及待的下载了,这个东西了。去了趟官网。这家伙提供了社区版和企业版,我第一次尝试的是社区版,然后很不负众望的失败了。后面我果断百度了下,度娘也不是万能了,大多数“玩家”用的都是Mac这让我很头疼。不过索性我在官方的文档上面找到了解决方法。
在官网注册账号成功之后,会自动下载,然后我把它拖到了,我的虚拟机中。
然后执行如下操作:
1.随意选择一个文件夹,执行解压命令,会看到一堆解压的数据。如果桌面上出现图三的文件夹则标志着成功。
图三
2.接下来为这个虚拟机配置运行环境,因为我是linux的系统,所以我就选择了第一行的配置项目。格式如下:
export PATH=/path/to/graalvm/bin:$PATH
在我的机器上配置出来的效果是:
其中:/home/gjt/Desktop/graalvm-ee-1.0.0-rc4/bin是我的安装路径。
export PATH=/home/gjt/Desktop/graalvm-ee-1.0.-rc4/bin:$PATH
出现如下界面,即为配置成功。
操作篇:
做完了,虚拟机的配置,接下来就是针对基础代码的测试了。
java代码:
执行新增命令,打开一个文件。
这是我编写的基础代码
然后用javac编译,然后java编译执行:
之后我们尝试官网的native-image方式运行,发现了错误,
无奈,鉴于网上的参考资料很少,我选择了去官方的git上issue寻找答案。
果然还是有同道中人的,这是Oracle官方人员给出的修复答案。
我决定抱着试一试的心态,开始了尝试。
再次执行编译。
最终我还是成功的编译了这个HelloWord文件,
接下来最激动人心的时刻到了。
图一是经过native-image过后的启动时间。
图一
图二是传统java启动时间。
图二
速度得到了明显的提升。
我们可以看到经过镜像加速之后的代码速度得到了明显提升。
官方的解释是:GraalVM可以将Java字节码编译为本机映像,以实现更快的启动速度和更小的应用程序占用空间。所以,本机映像比直接在JVM上运行相同代码要快得多:
最后的操作:
测试完java代码之后我们测试一波js代码,很明显基本的js语法都已经支持了。
再来一波Node代码,
测试代码:
var http = require('http'); http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8080); // 终端打印如下信息
console.log('Server running at http://127.0.0.1:8080/');
最后,我们尝试一下它的其他特性:
在下面这段代码中,我同时使用了js的语法。
这就不得不提一下Polyglot。
Polyglot工作原理
GraalVM允许您使用无缝方式编写多语言应用程序,以便将值从一种语言传递到另一种语言。使用GraalVM时,不需要像其他多语言系统一样进行复制或编组。这使您可以在跨越语言边界时实现高性能。大多数情况下,完全没有语言边界的额外费用。
开发人员通常不得不做出令人不舒服的妥协,要求他们用其他语言重写他们的软件。例如:
- “那个图书馆没有我的语言版本。我需要改写它。“
- “这种语言非常适合我的问题,但我们无法在我们的环境中运行它。”
- “这个问题已经用我的语言解决了,但语言太慢了。”
使用GraalVM,我们的目标是允许开发人员自由选择适合手头任务的语言而不会妥协。
为了提供外语多语言值,我们开发了所谓的多语言互操作性协议。该互操作性协议由一组标准化消息组成,每个Graal语言实现并用于外部多语言值。该协议允许GraalVM支持任何语言组合之间的互操作性,而无需彼此了解。我们计划逐步改进协议,以便随着时间的推移支持越来越多的功能。
有关详细信息,我们建议您阅读:
- 马蒂亚斯严峻,克里斯·西顿,罗兰·沙茨,Würthinger,HanspeterMössenböck 高性能跨语言互操作性的多语言运行时 在程序中的第11动态语言研讨会(DLS)的。
详情参考:https://www.graalvm.org/docs/reference-manual/polyglot/
弱化主语言
GraalVM开发了一个实验性的启动器「polyglot」。在polyglot里面不存在主语言的概念,每种语言都是平等的,可以使用polyglot运行任意语言编写的程序,而不需要前面的每种语言单独一个启动器。polyglot会通过文件的扩展名来自动分类语言。
结束语:
从开始学习,到环境搭建和测试,确实遇到了很多坑,但是,也正因为这些坑,让我有所收获,确实学到了很多。这个东西,总体来说,还是不错的。后续我会尝试将项目打包上去进行测试。
参考资料:
https://github.com/oracle/graal/issues/343 GraalVM官方github issues
https://www.graalvm.org/docs/ GraalVm官方文档
https://juejin.im/post/5ad7372f6fb9a045e511b0a4 全栈虚拟机GraalVM初体验
初探Oracle全栈虚拟机---GraalVM的更多相关文章
- 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!
前阵子,Oracle 发布了一个黑科技 "GraalVM",号称是一个全新的通用全栈虚拟机,并具有高性能.跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM ...
- 无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/虚拟机/Docker/Redis)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:"不好意思,虽然 ...
- .NET全栈开发工程师学习路径
PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...
- 洗礼灵魂,修炼python(73)--全栈项目实战篇(1)——【转载】前提准备之学习ubuntu
本篇是为项目实战做准备,学习Linux是必备的,不然都不好意思叫全栈对吧?下面是一位资深大神写的文章,够详细,我也不用浪费时间再写了 原文链接:Ubuntu学习——第一篇 内容: 一. Ubuntu简 ...
- Java全栈工程师知识体系介绍
Java全栈工程师,是指掌握多种技能,并能利用多种技能独立完成产品的人,也叫全端工程师(同时具备前端和后台能力),英文Full Stack developer. 那么想要成为一名合格的Java全栈工程 ...
- duang~免费的学习视频来啦:学霸君之全栈测试
学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...
- 怎样成为全栈工程师(Full Stack Developer)?
"Facebook 工程师说 Facebook 只招 full stack engineer,那么 Facebook engineer 都是怎样的人啦."? 具体经验不重要,重要的 ...
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(一)
目的: 结合现在比较流行的技术,通过一个demo 展示一个全栈式设计的各种技能. 一个全栈式的工程师,应该能设计通过verilog/VHDL做logical设计.能写内核驱动,能架站. 要熟悉veri ...
- 全栈必备 JavaScript基础
1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业.在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排第一,Java 第二,Python 反超 ...
随机推荐
- Python处理图片
# -*- coding: UTF-8 -*- from PIL import Image import os import sys reload(sys) sys.setdefaultencodin ...
- 设置windows服务依赖项
场景还原:python2.7开发的项目,制作成了windows服务,随系统启动.系统重启后发现服务未能自动启动,检查事件查看器日志发现服务先于Mysql数据库服务启动,由于服务中必须对MySQL进行访 ...
- 进程以及进程通信(IPC)类型
这里用我有限的知识来解释同时参考了一些其他博主的子类,希望能给与一部分入门的朋友一个清晰的理解,有问题之处还请指出 首先简单谈一下什么是进程? 答:进程是装入内存运行的程序段,是许多的系统对象拥有权的 ...
- 04 body中的相关标签
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python初学者的经历
刚开始安装了个python3.6的版本,自己写了个hello world ,发现可以运行,后面又网上找到了下载酷狗音乐的代码,结果报各种包没有,使用pip安装也各种安装不起来 又从网上找了python ...
- Netty源码分析--Channel注册(中)(六)
接上一篇,我们继续看 不知道大家第一次看这段代码的时候有没有一脸懵逼,反正我是一脸懵,为什么这个if else 最终都是调用的register0方法,都是一样的. 其实这里就是为什么Netty是线程安 ...
- 新手怎么学JS?JavaScript基础入门
新手应该怎么学习JS?JavaScript入门 - 01 准备工作 在正式的学习JavaScript之前,我们先来学习一些小工具,帮助我们更好的学习和理解后面的内容. js代码位置 首先是如何编写Ja ...
- 【转载】JDK自带的log工具
版权声明:本文为Jaiky_杰哥原创,转载请注明出处.This blog is written by Jaiky, reproduced please indicate. https://blog.c ...
- 【linux杂谈】在SSH连接中,openssh如何解决'Connection refused'错误?
openssh是SSH (Secure SHell) 协议的免费开源实现.SSH协议族可以用来进行远程控制, 或在计算机之间传送文件. 这就意味着远程登陆,文件推拉特别是搭建集群后公钥的部署,经常要利 ...
- (ps2018)Adobe Photoshop CC 2018 中文版破解版
ps2018新功能 1.更紧密连接的 Photoshop.全新的智慧型锐利化. 2.智慧型增加取样.内含 Extended 功能.Camera RAW 8 和图层支援 3.可编辑的圆角矩形.多重形状和 ...