11-GraalVM元原生时代的Java虚拟机

文章目录

  • GraalVM诞生的背景
    • Java在微服务/云原生时代的困境
      • 事实
      • 矛盾
    • 问题根源
      • Java离不开虚拟机
    • 解决方案
      • 革命派
      • 保守派
  • GraalVM入门
  • GraalVM特征
  • GraalVM下载和安装
    • GraalVM下载
    • win10安装及配置
    • linux安装及配置
  • GraalVM初体验(Linux)
  • 多语言开发(了解即可、官网有Demo)
    • GraalCompiler
    • Graal 和 C2 的区别
    • GraalVM与SpringBoot

GraalVM诞生的背景

Java在微服务/云原生时代的困境

事实

Java总体上是面向大规模、长时间的服务端应用而设计的。
严(luō)谨(suō)的语法利于约束所有人写出较一致的代码,利于软件规模的提升;
但是像即时编译器(JIT)、性能优化、垃圾回收等有代表性的特征都是面向程序长时间运行设计的,需要一段时间来达到最佳性能,才能享受硬件规模提升带来的红利。

矛盾

在微服务的背景下,提倡服务围绕业务能力构建,不再追求实现上的严谨一致;
1、单个微服务就不再需要再面对数十、数百GB乃至TB的内存;
2、有了高可用的服务集群,也无须追求单个服务要7×24小时不可间断地运行,它们随时可以中断和更新。
所以微服务对应用的容器化(Docker)亲和度(包容量、内存消耗等)、启动速度、达到最高性能的时间等方面提出了新的要求,这些恰恰是Java的弱项。
比如:现在启动一个微服务项目(Docker运行6个子服务),动不动就1分钟,如下图:
在这里插入图片描述

问题根源

Java离不开虚拟机

所以Java应用启动的时候,必须要启动虚拟机,进行类加载,无论是启动时间,还是占用空间都不是最优解

解决方案

革命派

直接革掉Java和Java生态的性命,创造新世界,譬如Golang

保守派

尽可能保留原有主流Java生态和技术资产,在原有的Java生态上做改进,朝着微服务、云原生环境靠拢、适应。其中最大的技术运用就是GraalVM!

GraalVM入门

GraalVM 是一个高性能 JDK 发行版,旨在加速用Java和其他JVM语言编写的应用程序的执行,并支持 JavaScript、Ruby、Python 和许多其他流行语言(翻译自官网 https://www.graalvm.org/)
在这里插入图片描述

GraalVM想成为一统天下的“最终”虚拟机!而GraalVM要做到原因也很简单:
大部分脚本语言或者有动态特效的语言都需要一个语言虚拟机运行,比如CPython,Lua,Erlang,Java,Ruby,R,JS,PHP,Perl,APL等等,但是这些语言的虚拟机水平很烂,比如CPython的VM就不忍直视,而HotSpotVM是虚拟机的大神级别,如果能用上HotSpot,能用上顶级的即时编译器(JIT)、性能优化、垃圾回收等技术,岂不爽歪歪!

GraalVM特征

  1. GraalVM是一款高性能的可嵌入式多语言虚拟机,它能运行不同的编程语言
  • 基于JVM的语言,比如Java, Scala, Kotlin和Groovy

  • 解释型语言,比如JavaScript, Ruby, R和Python

  • 配合LLVM一起工作的原生语言,比如C, C++, Rust和Swift

  1. GraalVM的设计目标是可以在不同的环境中运行程序
  • 在JVM中

  • 编译成独立的本地镜像(不需要JDK环境)

  • 将Java及本地代码模块集成为更大型的应用

GraalVM下载和安装

GraalVM分成了社区版与企业版(好消息目前都免费!)
企业版肯定比社区版好,所以推荐下载企业版,因为演示的原因,我使用的是20的版本
在这里插入图片描述

GraalVM下载

官网下载地址:
https://www.oracle.com/downloads/graalvm-downloads.html
在这里插入图片描述

win10安装及配置

在这里插入图片描述
在这里插入图片描述
配置时要注意,如果配置不成功,极有可能是windows10中JDK8优先了,解决方案:windows10 修改java环境变量不生效
在这里插入图片描述
在这里插入图片描述
使用 GraalVM Enterprise,您可以将 Java 字节码编译为特定于平台的、自包含的本机可执行文件(本机映像 Native Image),以实现更快的启动和更小的应用程序占用空间。
安装命令如下:

gu install native-image

在这里插入图片描述
在这里插入图片描述
如果是在windows中如果要使用 本机映像 (Native Image)需要安装VC,具体见:另https://www.jianshu.com/p/a5cdf85e4ffa

linux安装及配置

  1. 官网下载安装包,FTP上传至安装目录
    在这里插入图片描述
    在这里插入图片描述

  2. 解压安装包
    在这里插入图片描述
    在这里插入图片描述

  3. 配置环境变量
    在这里插入图片描述
    在这里插入图片描述

  4. 使用 GraalVM Enterprise,您可以将 Java 字节码编译为特定于平台的、自包含的本机可执行文件(本机映像 Native Image),以实现更快的启动和更小的应用程序占用空间。
    安装命令如下:
    在这里插入图片描述
    在这里插入图片描述

GraalVM初体验(Linux)

  1. 写一个简单的类
    在这里插入图片描述

  2. 编译->执行
    在这里插入图片描述

  3. 打包成一个本地可执行文件(Native Image功能)
    在这里插入图片描述

这样就会生成一个可执行文件。这个过程我就称之为将Java 字节码编译为特定于平台的、自包含的本机可执行文件(本机映像 Native Image),以实现更快的启动和更小的应用程序占用空间。
更快速的启动:

对比下,通过 time命令来对比
1、通过java 走虚拟机来运行
在这里插入图片描述

2、不通过java虚拟机直接运行
在这里插入图片描述

对比发现,通过这种方式启动一个简单的类,启动速度要快很多。
阿里早就通过这种方式加快容器的启动速度,直接启动速度提升20倍
https://www.graalvm.org/native-image/
在这里插入图片描述

另外这种可执行文件是不需要JDK的环境的,所以可以非常方便的完成快速的容器化部署,符合云原生的要求,例如:
我们把这个可执行文件拷贝到另外一台没有任何JDK的环境的服务器上,照样可以运行。
在这里插入图片描述

graal 的 aot 属于“GraalVM ”中的一项技术。

Ahead-of-time compile(提前编译),他在编译期时,会把所有相关的东西,包含一个基底的 VM,一起编译成机器码(二进制)。

好处是可以更快速的启动一个 java 应用(以往如果要启动 java程序,需要先启动 jvm 再载入 java 代码,然后再即时的将 .class 字节码编译成机器码,交给机器执行,非常耗时间和耗内存,而如果使用AOT,可以取得一个更小更快速的镜像,适合用在云部署上)

多语言开发(了解即可、官网有Demo)

GraalCompiler

Graal Compiler是GraalVM与HotSpotVM(从JDK10起)共同拥有的服务端即时编译器,是C2编译器的替代者。
C2还存在一些小BUG,例如:

public class C2Bug {

    public void test() {
        int i = 8;
        while ((i -= 3) > 0);
        System. out .println("i = " + i);
    }
    
    public static void main(String[] args) {
        C2Bug c2bug = new C2Bug();
        for (int i = 0; i < 50_000; i++) {
            c2bug.test();
        }
    }
    
}

在这里插入图片描述

使用-Xint 参数强制虚拟机运行于只有解释器的编译模式,就不会出现问题。
在这里插入图片描述

另外把循环次数降低,降低到5000次,就不会触发JIT,就不会触发C2的优化也不会出现问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

即时编译器是 Java 虚拟机中相对独立的模块,它主要负责接收 Java 字节码,并生成可以直接运行的二进制码。
传统情况下(JDK8),即时编译器是与 Java 虚拟机紧耦合的。也就是说,对即时编译器的更改需要重新编译整个 Java 虚拟机。这对于开发相对活跃的 Graal 来说显然是不可接受的。
为了让 Java 虚拟机与 Graal 解耦合,我们引入了Java 虚拟机编译器接口(JVM Compiler Interface,JVMCI),将即时编译器的功能抽象成一个 Java 层面的接口。这样一来,在 Graal 所依赖的 JVMCI 版本不变的情况下,我们仅需要替换 Graal 编译器相关的 jar 包(Java 9 以后的 jmod 文件),便可完成对 Graal 的升级。

Graal 和 C2 的区别

Graal 和 C2 最为明显的一个区别是:Graal 是用 Java 写的,而 C2 是用 C++ 写的。相对来说,Graal 更加模块化,也更容易开发与维护,毕竟,连C2的开发者都不想去维护C2了。

许多人会觉得用 C++ 写的 C2 肯定要比 Graal 快。实际上,在充分预热的情况下,Java 程序中的热点代码早已经通过即时编译转换为二进制码,在执行速度上并不亚于静态编译的 C++ 程序。

Graal 的内联算法对新语法、新语言更加友好,例如 Java 8 的 lambda 表达式以及 Scala 语言。

例如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GraalVM与SpringBoot

2021年03月11日官方宣布的Spring Native只是beta版本,请不要用于生产环境!!!

来谈谈 GraalVM的未来发展
spring 6.0和spring boot3.0都会基于jdk17构建,spring官方也写的很清晰,会继续维护和升级spring 2.0的版本,如果有人不愿意升级,一样可以使用老的版本。
spring 6.0和spring boot3.0总体来说是彻底拥抱aot,让spring native变得更加流行,所以在Spring6与SpringBoot3广泛之前spring native还肯定不是主流而已。
同时jdk17也没有写完loom,代表着没有协程,性能方面比有协程jdk差远了。比如阿里开源的jdk8,11,就有非侵入式携程,在高并发项目中性能比jdk17要强。
所以到底是Oracle公司在引导Java了,还是有可能国内的公司引导了,这个都不好说!

做一个预测
java的协程框架未来很大可能性是阿里等公司主导,而不是Oracle,这个是因为国内的软件行情的原因(高并发项目多)
而云原生的虚拟机则应该是Oracle公司主导,因为国外开发者,大多不会强制限定一定是Java语言,喜欢多语言开发,所以应该来说比较受欢迎,而国内则不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/270396.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Gitlab】CICD流水线自动化部署教程

第一步&#xff0c;准备 GitLab 仓库 这个不用多说&#xff0c;得先保证你的项目已经托管在一个 GitLab 仓库中。 第二步&#xff0c;定义 .gitlab-ci.yml 文件 在你的项目根目录中创建一个 .gitlab-ci.yml 文件。这个文件将定义所有 CI/CD 的工作流程&#xff0c;包括构建、测…

连锁餐饮数字化:一体化运营管控平台

内容来自演讲&#xff1a;刘腾飞 | 上海奥谱创网络科技有限公司 | CEO 摘要 本文介绍了企业级管理系统的需求和现状&#xff0c;以及如何通过数据指标为依据的改善循环来优化企业的运营。文章还提出了场景驱动、迭代上线的方法&#xff0c;并介绍了两个平台、三个统一的解决方…

RK3568平台开发系列讲解(Linux系统篇)Linux 热拔插机制 mdev的使能

🚀返回专栏总目录 文章目录 一、什么是热插拔二、热插拔的机制三、mdev的开启沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 热拔插。 一、什么是热插拔 热插拔是指在设备运行的情况下,能够安全地插入或拔出硬件设备,而无需关闭或重启系统。这意…

自动驾驶中的“雷达”

自动驾驶中有好几种雷达&#xff0c;新手可能会蒙蔽&#xff0c;这里统一介绍一下它们。 首先&#xff0c;所有雷达的原理都是发射波&#xff0c;接收回波&#xff0c;并通过发射和接收的时间差以及波的速度计算距离。只不过发射的波不同&#xff0c;功能也不同。 激光雷达 …

kubelet源码学习(二):kubelet创建Pod流程

本文基于Kubernetes v1.22.4版本进行源码学习 4、kubelet创建Pod流程 syncLoop()的主要逻辑是在syncLoopIteration()方法中实现&#xff0c;Pod创建相关代码只需要看处理configCh部分的代码 // pkg/kubelet/kubelet.go // 该方法会监听多个channel,当发现任何一个channel有数…

Jenkins的特殊操作定时自动执行任务以及测试报告调优

java -Dhudson.model.DirectoryBrowserSupport.CSP -jar Jenkins.war 测试报告 不美丽 执行上面的代码 重启jenkins 就好了

基于SpringBoot+Vue实现的电影院售票系统

文章目录 项目介绍影院管理影片管理影厅管理订单管理用户管理角色权限管理 技术选型成果展示前台系统后台管理系统 账号及其他说明 项目介绍 基于SpringBootVue实现的电影院售票系统整体设计了用户、管理员两个角色。 用户登录系统可进行电影查看、分类查看、影片搜索、选择影…

如何解决HTTP 404错误,这里给出详细解决办法

404错误是一个HTTP状态代码,这意味着你试图在网站上访问的页面在他们的服务器上找不到。 需要明确的是,该错误表示虽然服务器本身是可访问的,但显示该错误的特定页面是不可访问的。 个别网站经常自定义这个错误信息。所以,请记住,错误可能会以任何可以想象的方式出现,这…

SDCMS靶场漏洞挖掘

昨天才打完了khbc靶场&#xff0c;今天就马上投入到sdcms靶场&#xff0c;通过这个靶场&#xff0c;还是有不少的感悟的&#xff0c;下面&#xff0c;我们就以网安小白的身份来审视一下这个靶场&#xff01;&#xff01; ​​​​​​​ ​​​​​​​ ​​​​…

【华为机试】2023年真题B卷(python)-发广播

一、题目 题目描述&#xff1a; 某地有N个广播站&#xff0c;站点之间有些有连接&#xff0c;有些没有。有连接的站点在接受到广播后会互相发送。 给定一个N*N的二维数组matrix,数组的元素都是字符’0’或者’1’。 matrix[i][j]‘1’,则代表i和j站点之间有连接&#xff0c;mat…

软件测试面试--说一个印象最深的bug?

其实&#xff0c;面试官并不关心你描述的这个bug是否真的有价值&#xff0c;或有多曲折离奇&#xff1f;他只是&#xff1a; 1.了解你平时工作中的测试能力 所以&#xff0c;这就要求的你平时工作中遇到bug时试着自己去定位&#xff0c;定位bug的过程远比你的单纯的执行测试用…

华清远见作业第十六天

思维导图&#xff1a; 双向循环链表头插入&#xff1a; 代码&#xff1a; Doublelist insert_head(Doublelist head,datatype element) {//创建新节点sDoublelist screate_node();if(NULLs){return head;}s->dataelement;//数据存储//判断链表是否为空if(NULLhead){heads;…

解决Qt“报无法定位程序输入点xxx于动态连接库“问题

今天&#xff0c;在使用QtVS2019编译工程时&#xff0c;弹出"无法定位程序输入点xxx于动态链接库"问题&#xff0c;如图(1)所示&#xff1a; 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多&#xff1a; (1) 工程Release/Deb…

RK3588平台开发系列讲解(AI 篇)RKNN rknn_query函数详细说明

文章目录 一、查询 SDK 版本二、查询输入输出 tensor 个数三、查询输入 tensor 属性(用于通用 API 接口)四、查询输出 tensor 属性(用于通用 API 接口)五、查询模型推理的逐层耗时六、查询模型推理的总耗时七、查询模型的内存占用情况八、查询模型里用户自定义字符串九、查询原…

双端队列、优先级队列、阻塞队列

双端队列、优先级队列、阻塞队列 文章目录 双端队列、优先级队列、阻塞队列1 双端队列1.1 概述1.2 应用实例1.2.1 双端链表实现1.2.2 数组实现1.2.3 测试代码 1.3 课后作业- LeeTCode103 2. 优先级队列2.1 概述2.2 基于无序数组实现2.3 基于有序数组实现2.3 堆实现优先级队列2.…

阻抗控制中的弹簧与阻尼影响分析

阻抗控制是一种机器人控制方法&#xff0c;通过调整机器人的阻抗来实现对机器人的精准控制。在阻抗控制中&#xff0c;弹簧和阻尼是两个重要的参数&#xff0c;它们对机器人的性能和稳定性有很大的影响。 弹簧代表机器人的刚度和弹性&#xff0c;而阻尼代表机器人的阻尼特性&a…

63权限提升-Linux脏牛内核漏洞SUID信息收集

今天讲到的方法是suid和内核漏洞 案例一Linux 提权自动化脚本利用-4 个脚本 两个信息收集&#xff1a;LinEnum、linuxprivchecker 两个漏洞探针&#xff1a;linux-exploit-suggester、linux-exploit-suggester2 信息收集有什么用&#xff1f; 信息收集就能判断能否进行s…

无人叉车驻车定位RFID传感器CNS-RFID-01|1S的CAN总线通信连接方法

无人叉车驻车定位RFID传感器CNS-RFID-01|1S支持CAN总线通信方式&#xff0c;广泛应用于智能仓库&#xff0c;AGV |RGV小车&#xff0c;无人叉车&#xff0c;搬运机器人定位&#xff0c;驻车等领域&#xff0c;本篇幅主要介绍器CNS-RFID-01|1S RFID传感器的CAN总线通信连接方法。…

re模块(正则)

【 一 】 re模块概述 在线测试工具 正则表达式在线测试 - 站长工具 随着正则表达式越来越普遍&#xff0c;Python 内置库 re 模块也支持对正则表达式使用 Python 提供了re模块可以支持正则表示表达式使用&#xff0c;re模块提供了9个常量、12个函数 使用方法&#xff1a; re…

leetcode 38. 外观数列(medium)(优质解法)

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {public String countAndSay(int n) {//要进行 n - 1 次描述才能得到结果// last 代表当前要描述的字符串String last"1";// ret 代表描述…