GraalVM编译SpringBoot程序

news2024/11/13 9:06:09

GraalVM 提供了一个名为 “Native Image” 的工具,它能够将 Java 应用程序预编译成本机可执行文件。这种方法的优点是启动速度快,内存占用少,因为程序运行时不需要 JVM 和类加载。

然而这种方式也存在一些弊端,如预编译的 GraalVM Native Image 相比于在 HotSpot JVM 上运行的相同程序,它没有一个先进的即时编译器 (JIT) ,因此就不能在运行时分析和优化代码,无法利用这些运行时优化,因此在性能表现上可能会有所降低。

本文接下来将教你如何使用 GraalVM 编译 SpringBoot 程序。

文章目录:

  • 本机(或虚拟机)上安装 GraalVM JDK17
  • 安装一些编译工具
  • 编译 SpringBoot 程序

一、本机(或虚拟机)上安装 GraalVM JDK17

注意:本机(或虚拟机)的 CPU 必须具有 2 核心以上,运行内存 4GB 的硬性条件。否则在后面的编译过程中,很有可能会因为内存不足而触发编译失败。

访问 GraalVm for GitHub 链接,下载你需要的 JDK:https://github.com/graalvm/graalvm-ce-builds/releases/。这里因为我本机是 MacOS 系统,且 CPU 是 ARM 架构的,所以我选择下载macOS (aarch64) † JDK17(大家依据自己实际情况进行下载即可):

image-20230501221201674

下载完毕之后,安装 JDK。这里由于篇幅关系,我不对安装 JDK 作过多介绍,简单来说就是解压文件、配置 JAVA_HOME 与 PATH 路径。

安装完 GraalVm JDK 之后,我们应该能在命令行上直接运行指令 java -version。此外,还能运行命令 gu list,如果你这两项都没问题,那么安装成功。

gu 是 GraalVM 的组件安装器 (GraalVM Updater),你可以使用 gu 来安装、列出和卸载 GraalVM 中的各种组件。

image-20230501222104198

二、安装一些编译工具

  1. 安装 native-image

    native-image 是 GraalVM 提供的一个工具,它可以将 Java 应用程序预编译为本机可执行文件,这样生成的文件可以直接运行,无需 JVM 或者任何其他的运行时环境。

    在这里,我们需要借助 gu 来安装 native-image,具体如下:

    友情提示:需要访问外网

    gu install native-image
    

    image-20230501222346194

  2. 安装gccglibc-develzlib-devel

    如果你是 MacOS 系统,请运行:

    brew install gcc zlib
    

    如果你是 CentOS 系统,请运行:

    yum install -y gcc glibc-devel zlib-devel
    

    如果你是 Ubuntu 系统,请运行:

    sudo apt install gcc libc6-dev zlib1g-dev
    

三、编译 SpringBoot 程序

上面两步全部运行成功之后,我们随意选择一个 Spring Boot 项目(必须是 SpringBoot 3.0 版本以上 + JDK17),比如我这里新建了一个 hello_graalvm 项目。进入项目主目录,命令行执行 mvn -Pnative native:compile ,等待 5~10 分钟,程序会自动在 /target 目录下生成一个本机可直接执行的文件,直接就能运行,教程结束。

cd hello_graalvm
mvn -Pnative native:compile
# 运行新生成的可执行程序
./hello_graalvm

image-20230501223041206

image-20230501223438521

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

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

相关文章

扩展ACL配置

扩展ACL配置 【实验目的】 掌握扩展ACL的配置。认识扩展ACL的作用。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 R1 S0/3/0 192.168.1.1 255.255.255.252 N/A Fa0/0/0 …

操作系统:文件系统基础

文件系统基础 ​ 文件是以硬盘为载体的存储在计算机上的信息集合,文件可以是文档、图片、程序等。在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户的输入和输出中,则以文件为基本单位 文件控制块和索引节点 …

【Python基础练习100题--第二篇:文件篇】

前言 这些题都是在B站的练习题,链接在这 对于刚学python的新手来说十分的适合, 可以加强和巩固我们的基础。 嘿嘿 一起噶油吧!🍉 🍉1.对学生成绩排序 # 这里对字典进行排序,同事使用到了sorted函数 # 这…

stm32F103 WIFIESP8266模块连接阿里云平台

(43条消息) ESP8266 AT MQTT 透传指令接入阿里云物联网平台笔记;_安信可科技的博客-CSDN博客 这里这篇博客提到的固件是错误的 我用的固件是这个,刷固件之后,可以连上阿里云。 ATMQTTCLIENTID0,"ClienId"//clientId第二个参数注…

权限提升:烂土豆 || DLL 劫持.

权限提升:烂土豆 || DLL 劫持. 权限提升简称提权,由于操作系统都是多用户操作系统,用户之间都有权限控制,比如通过 Web 漏洞拿到的是 Web 进程的权限,往往 Web 服务都是以一个权限很低的账号启动的,因此通…

数字化转型:如何利用文件管理系统提高制造业的工作效率

对于制造行业的企业用户,在日常企业文件管理中会遇到怎样的问题呢?制造业又该该如何高效管理文件呢? 这些问题困扰着机械制造行业客户…… 1)项目多、文件杂,统一管理不便 2)文档资料在公司内部流转不畅 …

14-5-进程间通信-信号

一、信号的基本概述 1.什么是信号? (1)对于linux来说,信号是软中断。比如在终端输入ctrlc来中断正在运行的程序,原理是linux通过信号机制来停止一个程序。 (2)每一个信号都有一个名字和编号&…

Django项目页面样式如何“传给”客户端浏览器

前言 django项目在视图函数中借助render函数可以返回HTML页面,但是HTML页面中如果引入了外部CSS文件或者JavaScript文件在浏览器页面无法加载,因此就必须有一种方式能够将HTML文档中引入的外部文件能够在客户端浏览器上加载,这种方式就是配置…

QML状态与过渡(States and Transitions)

目录 一 状态(States) 一 过渡(Transitions) 通常我们将用户界面描述为一种状态。一个状态定义了一组属性的改变,并且会在一定的条件下被触发。另外在这些状态转化的过程中可以有一个过渡,定义了这些属性…

第二十章 中介者模式

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

SpringSecurity框架学习与使用

SpringSecurity框架学习与使用 SpringSecurity学习SpringSecurity入门SpringSecurity深入认证授权自定义授权失败页面权限注解SecuredPreAuthorizePostAuthorizePostFilterPreFilter 参考 SpringSecurity学习 SpringSecurity入门 引入相关的依赖,SpringBoot的版本…

IPsec中IKE与ISAKMP过程分析(快速模式-消息3)

IPsec中IKE与ISAKMP过程分析(主模式-消息1)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息2)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息3)_搞搞搞高傲的博客…

Spring - IoC

Spring - IoC Spring- IoC1)Spring简介1.1)什么是框架1.2)框架的作用1.3)Spring是什么1.4)Spring的体系结构1.5)Spring的发展历史1.6)Spring优势 2)IoC简介2.1)优质程序代码的制作原则2.2)耦合与内聚2.3)工厂模式发展史2.4)Spring发展历程2.5)IoC 3)入门案例3.1)案例环境说明3.…

synchronized用法加锁原理

目录 使用场景不同场景加锁对象结论验证实验实验1: synchronized 修饰方法,加锁对象是类实例,不同实例之间的锁互不影响实验2: synchronized 加在静态方法上,加锁对象是方法所在类,不同类实例之间相互影响实…

docker镜像导入导出

项目背景 1. docker pull 的时候比较慢的情况下, 之前已经下载过的话,可以直接导入使用 2. 有些服务器不允许上外网的情况下,可以先在自己电脑上下载好,再上传到服务器上进行安装 导出镜像 查看镜像 docker images 导出镜像 …

【文件系统】

目录 1 inode 2 软链接 3 硬链接 1 inode 当我们创建一个文件时,用带上 -i 选项可以查看文件的inode: 其中第一个选项就是文件的inode,除此之外另外几列表示的是: 模式 硬链接数 文件所有者 所属组 大小 最后修改时间文件名 ls -l读取存储在磁盘上的文…

windows编译安卓源码记录

环境 Windows10 vmware17 ubuntu22 ubuntu环境设置 装完ubuntu系统后拖拽复制文件进去验证vmtools安装情况,如果vmtools异常很麻烦,试了n多方法,最后还是重新安装系统解决, 如果ok的话,再继续下步骤,否…

【C++入门第四期】类和对象 ( 上 )

前言类的使用类的定义类的两种定义方式:成员变量名的定义建议 类的访问限定符类的作用域类的实列化如何计算类的大小结构体内存对齐规则 this指针this指针的特性 前言 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过…

Linux的目录结构

在Linux世界里,一切皆文件硬件如显卡、cpu等都会映射成一个文件具体的目录结构/bin 是Binary的缩写,这个目录存放着最经常使用的命令 /sbin(/usr/sbin、/usr/local/sbin) s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序 /h…