Graal编译器和GraalVM虚拟机

news2024/11/15 3:30:07

文章目录

  • 说明
  • Java程序执行流程
  • JVM的语言无关性
  • JVM的执行流程
  • 执行引擎的两种行为:解释执行和编译
  • 热点代码和热点代码探测方式
    • 热点代码
    • 热点代码探测方式
    • 热点代码探测方式流程
  • HotSpotVM内嵌两个JIT编译器
  • Graal编译器
  • GraalVM
  • GraalVM虚拟机安装和体验
    • GraalVM的下载和安装配置
    • 安装Visual Studio
    • GraalVM初体验

说明

  • 本文章学习自Java新一代Graal编译器和GraalVM虚拟机

Java程序执行流程

在这里插入图片描述

JVM的语言无关性

在这里插入图片描述

JVM的执行流程

JVM(Java虚拟机)的执行流程包括类加载器子系统、运行时数据区和执行引擎三个主要组成部分。

  1. 类加载器子系统:类加载器子系统负责将字节码文件加载到内存中,并转换成可以被JVM执行的内部表示形式。它由三个主要的类加载器组成

    • 启动类加载器(Bootstrap Class Loader):负责加载Java的核心库,如rt.jar等。
    • 扩展类加载器(Extension Class Loader):加载Java的扩展库,如jre/lib/ext目录下的JAR文件。
    • 应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载应用程序类路径上指定的类。
  2. 运行时数据区:运行时数据区是JVM用于执行程序时存储数据的区域,主要包括以下几个部分

    • 方法区(Method Area):用于存储类的结构信息,如类的字段、方法、常量池等。
    • 堆(Heap):用于存储创建的对象实例和数组。
    • 栈(Stack):每个线程在执行过程中会创建一个栈帧,用于存储方法的局部变量、操作数栈、方法出口等信息。
    • 本地方法栈(Native Method Stack):用于存储调用本地方法(Native Method)的栈。
  3. 执行引擎:执行引擎负责执行加载到内存中的字节码指令。它将字节码指令解释为具体的机器指令或直接通过即时编译技术将字节码编译成本地机器代码执行。执行引擎包括以下几个主要组件

    • 解释器(Interpreter):逐行解释字节码指令并执行。
    • 即时编译器(Just-In-Time Compiler,JIT):将热点代码(经常被执行的代码)编译成本地机器码执行,以提高执行速度。
    • 垃圾收集器(Garbage Collector):负责自动回收堆中不再使用的对象。

  • 通过类加载器子系统加载类文件,将类文件转换成运行时数据区的结构,然后由执行引擎执行相应的字节码指令,最终完成Java程序的执行过程。这个执行流程保证了Java程序在不同平台上的可移植性和跨平台性。

在这里插入图片描述

  • 运行时数据区
    在这里插入图片描述

  • 执行引擎
    public class Test{
    	public static void main(String[] args){
    		int a=138;
    		int b=362;
    		int c=a+b;
    	}
    }
    

在这里插入图片描述

执行引擎的两种行为:解释执行和编译

在这里插入图片描述

  • 解释器作用

    • 真正意义上所承担的角色是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行。由于解释器在设计和实现上非常简单,因此除Java语言之外,还有许多高级语言同样也是基于解释器执行的,比如Python、Ped、Ruby等。但是在今天,基于解释器执行已经沦落为低效的代名词,并且时常被一些c/c++程序员所调侃。
  • 时(JIT-justin time)编译器作用

    • 为了解决上述解释器低效的问题,JVM平台支持一种叫作即时编译的技术。即时编译的目的是避免函数被解释执行,而是将整个函数体编译成为机器码,并且将机器码做缓存,再次执行的时候直接执行机器码,这种方式可以使执行效率大幅度提升
  • 解释器启动时间较短,时编译器启动时间较长

  • 例如,JDK1.8

C:\Users\HP>java -version
java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)

热点代码和热点代码探测方式

热点代码

  • 热点代码
    • 根据代码被调用执行的频率而定决定是否需要启动JIT编译器将字节码直接编译为对应平台的本地机器指令。那些需要被编译为本地代码的字节码,称之为“热点代码”(一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为“热点代码”)
    • JIT编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升Java程序的执行性能。

热点代码探测方式

  • 热点代码探测方式
    • 采用基于计数器的热点探测,HotSpotVM将会为每一个方法都建立2个不同类型的计数器,分别为方法调用计数器(Invocation Counter)和回边计数器(BackEdge Counter)
  1. 方法调用计数器:用于统计方法的调用欧数
  2. 回边计数器:则用于统计循环体执行的语环次数
  • 以方法调用计数器为案例(回边计数器类似):该计数器就用于统计方法被调用的次数,默认阈值在 client模式下是 1500次,在 server模式下是10000次。超过这个阀值,就会触发JIT编译。
  • JDK1.8默认模式为server模式,默认阈值为10000次
    C:\Users\HP>java -version
    java version "1.8.0_341"
    Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)
    

热点代码探测方式流程

在这里插入图片描述

HotSpotVM内嵌两个JIT编译器

  • 在HotSpot VM中内嵌有两个JIT编译器,分别为Client Compiler和Server Compiler,简称为C1编译器和C2编译器。
    在这里插入图片描述
  • c2编译器启动时长比c1编译器慢,但在系统稳定执行后,c2编译器执行速度远远快于c1编译器

Graal编译器

  • 自JDK10后,Hotspot加入了全新的即时编译器:Graal编译器。编译效果追评C2编译器。Graal编译器是甲骨文实验室所做,能够替换c2的JIT编译器。

在这里插入图片描述

  • Graal编译器和c2编译器的区别:
    • C2编译器:C++所写
    • Graal编译器:java所写、优化更激进、开发时间比较现代

GraalVM

  • Graal编译器是GraalVM的核心组件,在HotSpot上装载Graal编译器,这上面还可以运行很多JVM 语言的,例如:Groovy、Java、Scala、Kotlin、Clojure。甲骨文实验室在此基础上,又开发了一个名为Trufle的框架,它是一个语言实现框架,可以让用户在这上面实现自己语言,目前可以实现并维护的语言:JS,Ruby,R,Python,C/C++、Fortran等。
    在这里插入图片描述

GraalVM虚拟机安装和体验

GraalVM的下载和安装配置

  1. graalVM下载地址,选择合适的版本下载
    在这里插入图片描述
  2. 解压下载文件,放到自定义目录
    在这里插入图片描述
  3. 配置环境变量
    JAVA_HOME: C:\Program Files\Java\graalvm-jdk-17.0.10+11.1
    Path: %JAVA_HOME%\bin
    
  4. 验证安装成功
    C:\Users\HP>java -version
    java version "17.0.10" 2024-01-16 LTS
    Java(TM) SE Runtime Environment Oracle GraalVM 17.0.10+11.1 (build 17.0.10+11-LTS-jvmci-23.0-b27)
    Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 17.0.10+11.1 (build 17.0.10+11-LTS-jvmci-23.0-b27, mixed mode, sharing)
    
  5. 安装native-image
    • GraalVM中的native-image是一个工具,它可以将Java应用程序编译成本地可执行文件,而不需要JVM。这意味着应用程序可以更快地启动并且占用更少的内存,因为它们不再需要JVM来运行。
    • native-image还可以提高应用程序的性能,因为它们可以直接在操作系统上运行,而不需要通过JVM进行解释。这使得GraalVM成为一个强大的工具,可以用于构建高性能的本地应用程序。
# gu 帮助命令
gu --help
# 查看已经安装的工具
gu list
# 如果没有自带,请执行安装命令,建议开启魔法
gu install native-image
C:\Users\HP>gu list
ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
graalvm                  23.0.3              GraalVM Core                  Supported
native-image             23.0.3              Native Image                  Early adopter

安装Visual Studio

  1. 安装Visual Studio编译为平台码所用

    • 安装Visual Studio主要是GraalVM将class文件编译成exe文件需要MSVC环境,虽然体积很大,但安装简单
    • 安装教程,参考网络即可
    • 注意安装组件,如下
      在这里插入图片描述
  2. 配置环境变量:请打开自己的机器目录进行查看

INCLUDE:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include

在这里插入图片描述

LIB:
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\lib\x64

在这里插入图片描述

PATH:
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64

在这里插入图片描述

GraalVM初体验

  1. 编写源文件HelloWGraalVM.java
    import java.util.Scanner;
    
    public class HelloWGraalVM {
        public static void main(String[] args) {
            System.out.println("hello GraalVM");
            
            Scanner scanner = new Scanner(System.in);
            System.out.println("please input:");
            String input = scanner.nextLine();
            
            if ("-1".equals(input)) {
                System.out.println("exit");
            } 
        }
    }
    
  2. 编译成class文件
    javac HelloWGraalVM.java
    
    在这里插入图片描述
  3. 编译为本地可执行文件
    - 使用native-image命令,需要先将Java源代码编译成class文件,然后再使用native-image进行编译
```bash
native-image HelloWGraalVM
```

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE】_传输层协议UDP与TCP

目录 1. 开发中常见的数据组织格式 1.1 XML 1.2 JSON 1.3 Protobuf 2. 端口号 3. UDP协议 4. TCP协议 4.1 特点 4.2 TCP报文格式 4.3 TCP可靠性机制 4.3.1 确认应答机制 4.3.2 超时重传机制 4.3.2.1 丢包的两种情况 4.3.2.2 重传时间 4.3.3 连接管理机制 4.3.3…

【Flink入门修炼】1-2 Mac 搭建 Flink 源码阅读环境

在后面学习 Flink 相关知识时,会深入源码探究其实现机制。因此,需要现在本地配置好源码阅读环境。 本文搭建环境: Mac M1(Apple Silicon)Java 8IDEAFlink 官方源码 一、 下载 Flink 源码 github 地址:h…

【Vue3+Vite】Vue生命周期与组件 快速学习 第三期

文章目录 一、Vue生命周期1.1 生命周期简介1.2 生命周期案例 二、Vue组件2.1 组件基础2.2 组件化入门案例2.3 组件之间传递数据2.3.1父传子2.3.2 子传父2.3.3 兄弟传参 总结 一、Vue生命周期 1.1 生命周期简介 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xf…

UE5 获得频谱让nigara随音乐律动

参考视频:UE - Niagara实现可视化音乐动态粒子效果 案例演示及教程_哔哩哔哩_bilibili 先创建一个Niagara 在Properties的Sim Target改为GPU,Calculate Bounds Mode改为Fixed模式 生成的数量改为1000 这里的BoxSize可以选择修改,具体作用是粒子初始生成的范围 Drag,阻力,用来限…

数据结构_找环,破环题-2.5

一. 判断单链表有无环 a. 错误的思路:遍历陷入死循环 1)和相交的遍历思路一样,找指向相同。 错误点 一直在死循环。 思考点:如何破环 b. 个人思路:反转链表回首结点 1)目前的经验,无非就…

浅谈应该遵守的伦敦银交易规则

做伦敦银投资的朋友应遵守伦敦银交易规则,伦敦银交易规则不是指那些伦敦银交易技巧,而是在这个市场中要遵循的一些约定,下面我们就来讨论一下。 风险管理。风险管理即指投资者控制自己一笔乃至整体交易的风险,没有风险管理意识的投…

Vue 条件渲染 双向绑定

https://www.dedao.cn/ebook/reader?id5lZOKpMGr9mgdOvYa6Ej75XRo1NML3jx810k8ZVzb2nqPpDxBeJlK4AyQ8RPQv2z v-if实现条件渲染的功能。v-model实现双向数据传输。 v-model用来进行双向绑定,当输入框中的文字变化时,其会将变化同步到绑定的变量上&#…

【敏感词】敏感词检测功能v1.1.0版本正式上线

背景 为了解决系统发布信息时人工审核成本高的问题,开发一个敏感词检测系统。该系统能够自动检测用户输入的内容中是否包含敏感词,从而减少不合规内容的发布,降低人工审核成本。通过实施这个系统,可以提高信息发布的效率和准确性…

ArraysLambda表达式

目录 一、Arrays 1、Arrays操作数组的工具类​编辑 二、Lambda表达式 1、Lambda初体验 ​编辑 2、函数式编程 ​编辑 3、Lambda表达式的标准格式 3.1 示例代码 4、小结 ​编辑5、Lambda表达式的省略写法 ​编辑5.1 示例代码 5.2 小结 ​编辑6、Lambda表达式的练习 …

redis源码之:集群创建与节点通信(2)

在上一篇redis源码之:集群创建与节点通信(1)我们可知,在集群中,cluster节点之间,通过meet将对方加入到本方的cluster->nodes列表中,并在后续过程中,不断通过clusterSendPing发送p…

Jmeter 示例,格式为001-100,按顺序生成三位数的函数

1.先添加一个循环控制器,每次执行生成一个数, 2.添加一个beanshell Sample,编写代码,把按00X这个格式的数字,赋值给一个变量LoopCount // 从JMeter变量中获取当前的计数器值 String loopCountStr vars.get("LoopCount"); int loopCount (lo…

maven依赖报错处理(或者maven怎么刷新都下载不了依赖)

maven依赖报错,或者不报错,但是怎么刷新maven都没反应,可以试一下以下操作 当下载jar的时候,如果断网,或者连接超时的时候,会自动在文件夹中创建一个名为*lastupdate的文件,当有了这个文件之后…

代理与Reflect反射

属性描述符 Proprety Descriptor 属性描述符 用于描述一个属性的相关信息 1.Object.getOwnPropertyDescriptor(对象,属性名) 可以得到一个对象的 某个属性的属性描述符 Object.getOwnPropertyDescriptors(对象) 可以得到某个对象的所有属性描述符 如果需要为某个…

数据库学习笔记2024/2/4

随笔 怎么学? 1、MySQL数据库就是存储和管理数据的一个大型软件,这个软件有一个专门的语言叫SQL,主要学的是SQL语言,但想要达到企业用人标准,就还得学会熟练使用MySQL这个软件。 2、学习分三阶段: 一. 基础篇 1. MySQL概述 1.1 数据库相关概念 数据库管理系统 -> MyS…

如何修改远程端服务器密钥

前言 一段时间没改密码后,远程就会自动提示CtrlAltEnd键修改密码。但我电脑是笔记本,没有end键。打开屏幕键盘按这三个键也没用。 解决方法 打开远程 1、远程端WINC 输入osk 可以发现打开了屏幕键盘 2、电脑键盘同时按住CtrlAlt(若自身电…

【论文+代码】ZS-N2N实现小样本零网络图像去噪

01、引言 本文方法源于Youssef Mansour和Reinhard Heckel撰写的论文《Zero-Shot Noise2Noise: Efficient Image Denoising without any Data》,该文作者探索了一种不需要任何数据且高效的高效图像去噪方法。 该方法使用两个固定的内核对噪声图像进行卷积&#xff…

【开源】基于JAVA+Vue+SpringBoot的快乐贩卖馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

c语言--指针运算

目录 一、指针-整数二、指针-指针2.1条件2.2两个指针指向同一块空间代码2.2.1运行结果 2.3两个指针指向不同块空间代码2.3.1运行结果 2.4总结 三、指针的关系运算3.1代码3.1.1运行结果3.1.2分析 一、指针整数 用数组举例: 因为数组在内存中是连续存放的&#xff0c…

C++:第十五讲高精度算法

每日C知识 system("color xx);是改变字体及背景颜色,前一个x代表一个数字,可以改变背景颜色,后一个x代表一个数字,可以改变字体颜色 ,但都是根据颜色表来的。 记住:要加头文件:#include&l…

详细关于如何解决mfc140.dll丢失的步骤,有效修复mfc140.dll文件丢失的问题。

mfc140.dll文件是Microsoft Visual Studio 2015程序集之一,它包含用于支持多种功能的代码和库。当这个mfc140.dll文件丢失时,可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到mfc140.dll丢失的问题,但是这并不是不可解决的困难。…