GraalVM Native学习及使用

概述

在开发Spring Boot 应用或者其他JAVA程序的过程中,启动慢、内存占用大是比较头疼的问题,往往需要更多的资源去部署,成本大幅提高。为了优化上述问题,常常使用优化程序、使用更小消耗的JVM、使用容器等措施。

现在有一个叫做Native Image(原生镜像)的技术,可以将JAVA应用的字节码直接编译为本地机器码,打包成本地可执行文件,运行应用时无需Java虚拟机进行动态编译,因此启动速度很快、内存消耗也很低。

JIT & AOT

通常程序有两种运行方式:

  • 动态解释:解释执行,运行时翻译为机器码。
  • 静态编译:程序在执行前全部被翻译为机器码,可以直接运行二进制文件。
JIT (动态编译)

JITJust-in-time的缩写,一般称为即时编译动态编译Java源代码在运行的过程中,类加载器将需要运行的字节码处理并分配到内存中,然后JVM执行引擎需要调用解释器将字节码翻译为计算机能执行的机器码,最后执行机器指令。

需要解释执行势必会造成运行效率降低,为了提高执行速度,JAVA引入了 JIT 编译器。当某个方法或代码块运行特别频繁的时候,JVM会将其标注为热点代码, JIT 编译器会将热点代码编译成本地机器相关的机器码,优化后进行缓存,下次执行这些代码时,直接调用缓存中的机器码,无需重复解释,在一定程度上提高了执行速度。
在这里插入图片描述

AOT(静态编译)

JAVA一直在努力提高启动和运行时性能,希望其能够在更广泛的场景达到或接近本地语言的性能。虽然引入了JIT 编译器,但是需要花费较长时间才能热身完,而且有些Java方法还没法编译,性能方面也会下降。

AOTAhead-of-Time的缩写,一般称为静态编译。程序在执行前全部被翻译为机器码,可以直接运行二进制文件,比如C++就是使用静态编译。
在这里插入图片描述

JDK 9 中, AOT作为实验特性被引入,只支持 java.base 模块可以编译成AOT库,使用jaotc工具将Java类文件编译为本机代码,避免了 JIT 预热等各方面的开销。但是实际运行效果不尽人意,最终在JDK 16中被删除。

JDK 17中,也移除了实验性的AOTJIT,彻底拥抱GraalVM实现静态编译。

在当前微服务、云原生盛行的时代,JAVA 程序显得越来越臃肿,虽然使用AOT也有诸多缺点,比如打包时间长、舍弃平台无关性、反射、JNI、动态代理的分析能力有限。但是JAVA 必定会向AOT发展,否则在云原生时代,可以能被其他后起之秀慢慢蚕食市场。

GraalVM

简介

官网地址
GitHub地址

GraalVM是一个高性能跨语言虚拟机,其目的是提升Java和其他JVM语言编写程序的执行速度,同时也为JavaScriptPython和许多其他流行语言提供运行时环境。起始于 2011 年 Oracle 实验室的一个研究项目。
在这里插入图片描述GraalVM三大核心:

  • Java 虚拟机提供高性能的JIT编译器
  • 高性能的AOT编译器,提前将 Java 字节码编译为本机机器码。
  • 多种语言的支持,GraalVMTruffle语言实施框架可与 GraalVM 编译器协作,以卓越性能运行 JavaScript、Python、Ruby 以及 JVM 支持的其他语言。

GraalVM提供了两种运行Java应用程序的方法:

  • HotSpot JVM上使用实时JIT编译器
  • 使用AOTJava应用程序编译的本地可执行文件

GraalVM 的优点:

  • 帮助开发人员显著提升应用的性能效率,同时降低IT成本。

  • 构建现代 Java 应用,通过微服务和容器来满足云原生需求,微服务是执行单一功能的小型、独立微应用。在现实中,业务应用通常要使用数百项服务,每项服务都需要快速启动,以尽可能降低延迟和云使用成本。

  • 可以构建一个各种编程语言基于单一 JVM 运行的生态系统,提高开发效率。

GraalVM 的缺点:

  • 舍弃了 Java的平台无关性,编译为本地执行文件,不同操作系统的服务器,编译出来的文件不一样,比如 Windows 编译出来的文件,并不能在Linux 系统运行,也就让JAVA丢失了平台无关性。JAVA设计之初,一次编译、到处运行是其最重要的特性,但是现在容器技术的出现,该特性显得很牵强。
  • 反射机制、CGLIB动态代理这些和字节码打交道的机制,是在程序运行时动态调用,无法经过 AOT 编译成原生代码,构建时还需要提供各种配置文件去适配。
  • 目前该技术并未大面积使用,并不成熟。
运行模式

GraalVM提供了多种操作模式。

1、JVM运行时模式

HotSpot JVM上运行程序时,默认使用GraalVM编译器作为顶级JIT编译器。在运行时,应用程序在JVM上正常加载和执行。JVM将字节码传递给编译器,编译器将其编译为机器代码并将其返回给JVM

2、原生镜像

Native Image是一种创新技术,它将Java代码编译为独立的本地可执行文件或本地共享库。在构建本机可执行文件期间,处理的Java字节码包括所有应用程序类、依赖项、依赖于第三方的库以及所需的任何JDK类。生成的本地可执行文件特定于每个操作系统和机器体系结构,并不需要JVM

3、Java on Truffle

Java on Truffle 是一个 JVM 实现,它使用了 Truffle 多语言执行框架。提供了Java虚拟机所有的核心组件,实现了与Java运行时环境库相同的API,并重用GraalVM中的所有JAR和本机库。支持多语言互操作,例如,JavaScript 程序可以运行Ruby方法,无需制作副本就能共享数值。基于JVM运行时,Truffle 能够与GraalVM编译器协作,将受支持语言编译为本机机器码,从而优化性能。

Native Image(原生镜像)

了解了GraalVM之后,我们着重了解并使用Native Image技术将一个Spring Boot 3项目编译为一个可执行二进制文件。

Native Image:是一种将Java代码提前编译为二进制文件的技术,即本机可执行文件。本机可执行文件只包含运行时所需的代码,即应用程序类、标准库类、语言运行时以及来自JDK的静态链接本机代码

Native Image处理应用程序类和其他元数据,以创建特定操作系统和体系结构的二进制文件。首先,本地镜像工具对代码执行静态分析,以确定应用程序运行时可访问的类和方法。其次,它将类、方法和资源编译成二进制文件。整个过程被称为构建,以明确区分它与Java源代码到字节码的编译。
在这里插入图片描述

Native Image生成的可执行文件优点:

  • 使用虚拟机所需资源的一小部分,运行时更低的内存消耗
  • 以毫秒为单位启动
  • 立即提供最高性能,无需预热
  • 可以打包成轻量级容器映像,以实现快速高效的部署
  • 更不容易遭到破解、攻击
Spring Native

Spring NativeSpring 社区的一个开源框架,可以通过GraalVMSpring应用程序编译成原生镜像。
在这里插入图片描述
官方推荐使用Spring Boot 3+GraalVM官方构建工具实现原生镜像构建,所以要注意Spring Native已经没必要再去研究及使用了

graalvm安装并使用native-image

下载GraalVM安装包

1 进入GitHub 下载地址

我选择的是JAVA11

3 配置环境变量

WIN键 搜索环境变量,即可打开。
如果之前配置过java的环境变量 可以直接替换掉JAVA_HOME
如果没有配置过,需要配置JAVA_HOME,并在系统path中添加 %JAVA_HOME%\bin
点击“确定”按钮保存更改。

tips: 刷新变量 WIN+R refreshenv
4 验证安装

如果输出的结果包含GraalVM的版本信息,则说明安装成功。
在这里插入图片描述
已经成功安装和配置了GraalVM在Windows上,可以开始使用它进行Java开发或者运行其他语言的程序。接下来需要安装native-image。

安装native-image

Native Image:是一种将Java代码提前编译为二进制文件的技术,即本机可执行文件。

gu.cmd install native-image

可以使用命令查看,已经安装的功能

gu.cmd list

在这里插入图片描述

测试

创建一个 HelloWorld.java
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello native image, World!");}
}
将HelloWorld.java编译为字节码,然后构建本机可执行文件:
javac HelloWorld.java
native-image HelloWorld

请添加图片描述
报错:要安装 Visual Studio 2022

安装 Visual Studio 2022

链接:
在这里插入图片描述

最后一个命令生成在当前工作目录中命名的可执行文件。 调用它将执行类的本机编译代码,如下所示:Hello native image, World!
在这里插入图片描述
成功!

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

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

相关文章

一起读《奔跑吧Linux内核(第2版)卷1:基础架构》- 大小端字节序

关注 点赞 不错过精彩内容 大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! Hello,大家好我是硬核王同学,是一名刚刚工作一年多的Linux工程师&#xff0…

计算机网络(9):无线网络

无线局域网 WLAN 无线局域网常简写为 WLAN (Wireless Local Area Network)。 无线局域网的组成 无线局域网可分为两大类。第一类是有固定基础设施的,第二类是无固定基础设施的。所谓“固定基础设施”是指预先建立起来的、能够覆盖一定地理范围的一批固定基站。 …

mapboxgl 中给地图添加遮罩蒙版,并不遮罩其中一块区域

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章主要是给一整块地图添加遮罩层蒙版,但是不遮罩其中一个区域,以反向高亮地区内容。 效果预览 技术思路 这里要实现某个区域反显高亮,需要这个区域的边界json文件,与ech…

每天五分钟计算机视觉:为什么要去GitHub寻找开源代码实现方案?

计算机视觉技术是当前人工智能领域的热门方向之一,其在许多领域都有着广泛的应用,如自动驾驶、智能安防、医疗诊断等。由于计算机视觉技术涉及到的算法和数据处理较为复杂,因此对于初学者来说,从零开始编写代码实现相关算法可能会…

案例088:基于微信小程序的校车购票平台设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

ASP.NET Core AOT

Native AOT 最初在 .NET 7 中引入,在即将发布的 .NET 8 版本中可以与 ASP.NET Core 一起使用。在这篇文章中,我们从总体角度审视其优点和缺点,并进行测量以量化不同平台上的改进。 源代码:https://download.csdn.net/download/he…

ebay产品名称规则是什么?eBay产品主图规则是什么?-站斧浏览器

ebay产品名称规则是什么? 1、简洁明了:在eBay上,产品命名应该简洁明了,避免使用过长或复杂的词汇。买家通常会使用关键词搜索商品,因此使用简洁的命名可以提高产品在搜索结果中的排名。 2、准确描述:产品…

《使用ThinkPHP6开发项目》 - ThinkPHP6创建菜单模块

#CSDN 年度征文|回顾 2023,赢专属铭牌等定制奖品# 一、创建菜单模块 1、创建系统菜单表 CREATE TABLE menu (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 菜单ID,menu_name varchar(32) NOT NULL DEFAULT COMMENT 菜单名称,path varchar(2…

KBDPL.DLL文件丢失,软件游戏无法启动,修复方法

不少小伙伴,求助说遇到Windows弹窗提示“KBDPL.DLL文件丢失,应用无法启动的问题”,不知道应该怎么修复? 首先,先来了解“KBDPL.DLL文件”是什么? kbdpl.dll是Windows操作系统的一部分,是一个动…

三菱plc的点动控制循环(小灯闪烁,单控气缸循环)

以为前一段时间小编做了一个气缸定时循环的程序,根据程序有不足之处,所以小编写下这篇文章,将网络上的plc小灯控制进行总结!如果对你有帮助,不要忘了点赞收藏!如果有更加好的梯形图,欢迎评论&am…

八怪:再谈 MySQL 8 这两个精准的时间戳

MySQL 8.0 的 binlog 中多了 immediate_commit_timestamp 和 original_commit_timestamp 的信息,网上也有很多文章进行解释,最近也刚好遇到相关问题,刚好稍微学习一下。 作者:高鹏(八怪),《MySQ…

教育机构培训系统小程序功能清单

制作一款适合自己的教育机构培训系统小程序,可以为学员提供更便捷的学习体验,同时提高机构的教学效率。今天将详细介绍如何使用乔拓云平台制作教育机构培训系统小程序。 在浏览器搜索乔拓云,登录到后台,选择教育系统并点击进入。在…

基于SSM(非maven)的教室预约管理系统——有报告(Javaweb)

项目简介 本项目为基于SSM(非maven)的教室预约管理系统,本项目主要分为二种角色:用户,管理员 管理员拥有功能:教室信息管理、预约审核管理、预约记录查询、用户注册管理、修改个人信息、退出登录等 用户…

2024年阿里云优惠券领取及使用教程

阿里云作为国内领先的云计算服务提供商,一直致力于为客户提供优质、高效的服务。为了更好地回馈客户,阿里云经常会推出各种优惠活动,其中就包括阿里云优惠券。本文将详细介绍如何领取及使用阿里云优惠券。 一、阿里云优惠券介绍 阿里云优惠券…

SpringBoot的基础配置

问题导入 入门案例中没有引入spring-webmvc等依赖包,没有配置Tomcat服务器,为什么能正常启动?我们没有配置端口号,为什么端口是8080? 起步依赖 starter SpringBoot中常见项目名称,定义了当前项目使用的所…

CEC2017(Python):五种算法(DBO、HHO、RFO、SSA、PSO)求解CEC2017

一、5种算法简介 1、蜣螂优化算法DBO 2、哈里斯鹰优化算法HHO 3、红狐优化算法RFO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、CEC2017简介 参考文献: [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem d…

阿里云系统盘测评ESSD、SSD和高效云盘IOPS、吞吐量性能参数表

阿里云服务器系统盘或数据盘支持多种云盘类型,如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等,阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

炫云常见咨询问题TOP榜(云渲染软件专题)

在上一期,小编带大家盘点了年度炫云云渲染使用相关常见咨询问题TOP20。这份榜单不仅是对过去一年用户关注焦点的回顾,更是一个汇总了各类问题解答的宝典。无论您是初次使用还是老用户,都能帮助您更快速地解决疑问,提升使用炫云各类…

Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果

原创作者:恋猫de小郭 相信大家都已经听说过,明年的 Harmony Next 版本将正式剥离 AOSP 支持 ,基于这个话题我已经做过一期问题汇总 ,当时在 现有 App 如何兼容 Harmony Next 问题上提到过: 华为内部也主导适配目前的主…

用js让用户输入一个数累加和

需求&#xff1a;用户输入一个数&#xff0c; 计算 1 到这个数的和。 比如 用户输入的是 5&#xff0c; 则计算 1~5 之间的累加和 并且输出到控制台 <body><script>let numprompt(请输入一个数)let sum0for(let i1;i<num;i){sumi}console.log(sum)</script…