初探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 反超 ...
随机推荐
- cloudsim 3.0.3下载与安装教程
1.配置jdk(之前的文章都讲解过,这里就不具体说了) 2.安装eclipse或MyEclipse 3.下载cloudsim压缩包,这个的官网是需要FQ,这里贴上我的下载地址 链接:https://p ...
- 直播技术:从性能参数到业务大数据,浅谈直播CDN服务监控
线上服务的有效监控和数据收集,一直是后端服务离不开的话题.直播作为一种经典的分布式系统,监控以及数据收集更是必不可少的工作.如何对海量的服务集群有效的监控和保活,又如何抓取集群中的碎片数据中来优化服务 ...
- mysql group_concat的长度问题
mysql group_concat的长度问题 show variables like 'group_concat_max_len';+----------------------+-------+| ...
- 利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法
1.利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法 首先判断字符串的长度是否为0,如果是,直接返回字符串 第二,循环判断字符串的首部是否有空格,如 ...
- HashMap原理(一) 概念和底层架构
HashMap在Java开发中使用的非常频繁,可以说仅次于String,可以和ArrayList并驾齐驱,准备用几个章节来梳理一下HashMap.我们还是从定义一个HashMap开始. HashMap ...
- hiccup和Latch off
hiccup(Constant-Current)和Latch off 限电流保护的两种形式 hiccup:一种是以恒定电流存在,这种一般是可恢复的,当故障解除后自动恢复: Latch off:一种是锁 ...
- 基于Django框架 CRM的增删改查
思路: 创建表------从数据库读出数据展示出来------配置路由-----写视图函数------写对应页面 练习点: 数据库建表 ORM 数据库数据读取 数据 ModelForm (form组 ...
- python爬虫登陆问题
根据腾讯课堂网页登陆问题进行解说(需要安装谷歌浏览器): 1.导入库 import requests from selenium import webdriver 2.根据腾讯课堂链接,进入页面,获取 ...
- 二、JavaScript的语法
目录: 1.变量:存储数据的容器 2.数据类型 3.string数据类型 4.number数据类型 5.boolean数据类型 6.数据类型的隐式转换 6.数据类型转换函数 7.特殊类型 8.算术运算 ...
- windows软件卸载工具Geek Uninstaller免安装版
曾经一个问题一直困扰这我,就是每次在卸载软件的时候都卸载不干净,卸载完后会有遗留文件夹,每次都要手动删,还有注册表也不干净,让我很是难受,直到有一天发现了一个卸载神器Geek Uninstaller ...