当前位置: 首页 > news >正文

GraalVM下一代JVM到底是什么?

6b38a3db35761c936922d37d9a1f8341.gif

GraalVM是什么?

在说 GraalVM 之前,我们先来聊聊 JVM , JVM 也就是 Java 虚拟机,如果我们想要运行 Java 程序,那就需要在 JVM 上进行运行,通过 JVM 将我们的代码翻译成机器能理解的代码,然后执行。那么我们 JVM 是只能运行 Java 的嘛,当然不是,我们还有很多比较出名的语言比如,Scala,Groovy都是通过各自的编译器编译成 Java 虚拟机对应的字节码,然后来进行执行。169b38135f8865c9b44eadb12bf2e85c.png

再来回到 GraalVM,乍一看好像是 Graal 这个语言的虚拟机,其实不是的,GraalVM 是 ORACLE 开发的一款“通用”虚拟机,怎么理解这个通用呢?上面我们说到 JVM 可以支持除了 Java 以外的语言,那么 GraalVM 他是可以支持 JavaScript,Python,Ruby,C 和 C++ 以及 JVM 语言等等(理论上来说只要做对应语言的开发,所有语言都可以支持)。

8ccc7005dc86727d34c2197827aab972.png

但是这里要值得注意的是 GraalVM 是用 Java 写的,所以作为一个 Java 程序员如果想修改虚拟机的代码,是不需要理解 C++ 或者 C 语言的。

GraalVM 作用是什么?

启动加速

我们知道弹性扩展是其中的核心,比如当我们的集群出现突发流量的时候,一般这个时候会快速扩容机器,但是由于我们的Java的特性,带来两个方面的慢:

  • 启动慢:当我们启动 Java 的时候,也就是将我们的 class 文件加载到JVM中,这个加载 class 可是一笔不小开销,需要检索,验证,解析等等。

  • 启动后开始运行慢:我们知道 Java 代码在启动后的一段时间之内是解释执行的,如果想要达到编译执行,是需要借助我们的 JIT 技术,将其直接编译成机器码执行,从而达到高效执行,这个也就是我们所说的预热。

74414075429a407b03be0f65c2600a75.png

前面两个阶段也就是大家平常比较熟悉的阶段,通过翻译和 c1 编译和 c2 编译来进行代码执行,而第三部分出现了一个 AOT 技术,也就是静态编译,可以在执行代码之前就将我们的代码编译成机器码,和C++ 一样,但是由于Java 有很多动态特性,一般我们利用 jaotc 来对 jdk 自带的包进行静态编译,然后其他的包依然采用翻译和 jit 执行。

所以就迎来了第四阶段 SubstrateVM (后面简称 SVM ),这个是基于 Graal 的 AOT 框架,他可以将我们的动态特性也可以进行静态编译,可以想一下 Java 里面最动态的其实就是反射,比如你要执行某个类的方法,你可能会这么写:

String method = "xx";
object.invoke(method);

可以发现我们的方法其实是一个字符串并且还是一个动态的变量,那这种这么动态的东西如何做到静态编译了,阿里内部是通过观察,比如这个程序上去跑个几周,获取 invoke 的所有场景,然后一起进行编译,当时也提问到如果这个有没有观察的怎么办呢,那么这个的确就会报错,所以这一块的使用的确是个问题。

9e19669b7776e6b919a4ee08c0a9934f.png

通过静态编译完成之后,我们的性能有得到提升吗?

d92036a33c3e638a72d600b048437e21.png

从上面的性能数据来看,我们的性能和 Go 是相当的,内存只有 Go 的一半,怪不得很多人都在说 Graal 就是用来替代 Go 的。

同时 Graal 编译器也可以替代 C2 编译器,在 Twitter 和 Facebook 内部生产环境已经使用 Graal 进行替换 C2。

所以对弹性伸缩,启动速度要求比较高的程序,可以考虑将 GraalVM 作为自己的虚拟机选择。

多语言调用

上面说过我们 GraalVM 支持很多语言,设想一下我们有个这样的需求,Java 做服务器的开发,Python 或者 R 语言去做数据分析,以前我们可能需要调用 Rpc 去做这样的事,现在我们可以将他们放在同一个项目或者同一个文件当中,利用 GraalVM 的特性就可以做到这样的事。

edfe8a214edda2e8cfdf8f002393321a.png

推荐阅读

Java 程序的静态编译是基础软件领域近年来新兴的一项革新型技术,彻底解决了 Java 应用的冷启动问题,使 Java 程序的运行时性能达到了启动即峰值的效果。GraalVM 开源社区是这方面的技术引领者之一,欢迎阅读由阿里资深专家林子熠老师写的《 GraalVM与Java静态编译:原理与应用》一书。本书系统地将 GraalVM 的静态编译技术介绍给读者,填补了这方面的空白。

a7afeaa754b0b23f3eb96678582f49ac.png

本书详尽地描述了 GraalVM 的代码架构及工作机制,并着重介绍其中有关静态编译的子项目 Substrate VM。如果你想了解云原生时代下 Java 的发展,那么非常推荐从本书入手,理解诸如 Spring Boot、Quarkus、Micronaut 等众多 Java 框架是如何摆脱笨重的 Java 虚拟机,实现低启动时间、低内存消耗的。

415c78c4b7ae6ebaf3c2db4963b10232.gif

更多精彩回顾

书讯 | 1月书讯(下)| 2022年的第一本书

书讯 | 1月书讯(上)| 2022年的第一本书

资讯 | 重磅!达摩院发布2022十大科技趋势

书单 | 6本书,读懂2022年最火的边缘计算

干货 | Flink1.14.2发布,除了log4j漏洞你还需要关注什么?

收藏 | Docker冲顶技术热词,微服务应用热度不减,中国云原生开发者真实现状如何?

上新 | 【新书速递】金融领域可解释机器学习模型与实践

11e5c7f69bd3821830d9c609afc4fea8.gif

a87aba5e60fead1818f6464ccb3c1575.gif

点击阅读全文购买

相关文章:

  • 【第89期】推荐几本电商必读书
  • 一文带你了解LoongArch自主指令系统
  • 2021年数据中台行业十大关键词
  • 测试工程师的未来发展方向在哪里?
  • 一个案例讲明白!如何更安全地实现数据备份和恢复
  • 省政协委员、南京大学人工智能学院院长周志华: 科研学习探索最重要的是“兴趣”和“勤奋”...
  • 为什么现在还有985高校给大一上C语言课?
  • 如何用数字化构建企业的“韧性”?
  • 前端应用和产品逻辑的核心:交互流
  • 2月书讯 (上)| 新年到,新书到!
  • 2月书讯(下)| 新年到,新书到!
  • Three.js 的 3D 粒子动画:群星送福
  • 如何平衡存储系统的一致性和可用性?
  • 浅谈压缩算法的那些事儿
  • 终于有人把SaaS讲明白了
  • Codepen 每日精选(2018-3-25)
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • jquery cookie
  • TypeScript迭代器
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • webpack+react项目初体验——记录我的webpack环境配置
  • 分类模型——Logistics Regression
  • 开发基于以太坊智能合约的DApp
  • 为视图添加丝滑的水波纹
  • 智能合约Solidity教程-事件和日志(一)
  • mysql面试题分组并合并列
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (6)设计一个TimeMap
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (算法)Game
  • (一)基于IDEA的JAVA基础12
  • .bat文件调用java类的main方法
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Core中的去虚
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET文档生成工具ADB使用图文教程
  • .NET中两种OCR方式对比
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [CSS]文字旁边的竖线以及布局知识
  • [Docker]六.Docker自动部署nodejs以及golang项目
  • [HNOI2010]BUS 公交线路
  • [IE9] IE9 beta版下载链接
  • [Java][Android][Process] ProcessBuilder与Runtime差别