1.前言
接触过java 的小伙伴肯定都知道大名鼎鼎jvm,我们写的java 程序,首先编译成class 文件,然后加载进jvm ,jvm负责将Java字节码( class,Java代码编译后生成的中间代码)转换为机器码并执行,今天我介绍一个特殊的jvm,可以将java 代码编译成二进制可执行文件,直接执行。一起来看看吧。
2.简介
首先看下官方介绍:
GraalVM是一种开源的通用虚拟机,由Oracle开发和维护。它旨在提供高性能和灵活性,能够运行多种编程语言,包括Java、JavaScript、Python、Ruby和其他语言。GraalVM支持在不同的应用场景中使用,例如服务器端应用、嵌入式系统、云计算等。GraalVM的一个主要特性是其即时编译(Just-In-Time Compilation)能力,它能够将高级语言的代码直接编译成本地机器码,从而提供更好的性能。此外,GraalVM还提供了AOT(Ahead-of-Time Compilation)编译器,可以将Java应用程序编译成本地可执行文件,从而提供更快的启动时间和更低的内存消耗。GraalVM还支持与其他编程语言的互操作性,可以在不同语言之间进行函数调用和数据传递。它还提供了一些工具和扩展,用于性能分析、代码优化和开发工具的集成。
看这个,感觉有点go 语言的特性呀,最近几年由于云技术的发展,go语言如日中天,可能java 也感觉到了危机,所以java 也在进步。
3.搭建环境
既然打算学习了解一下,那么我们就来实操一下,看看到底是什么样的。首先看下按照graalvm 需要哪些环境吧。
-
graalvm
-
jdk17
-
visual studio 2022
graalvm 打包需要用到vs的工具来编译,所以下载社区版就可以了
配置环境变量 1.java 环境变量改成jdk 17
2.配置graalvm 环境变量
再执行
gu.cmd install native-image
3 安装visual studio 安装时选择 c++桌面开发,然后等待安装完成
先在PATH 中添加vs 的路径
再增加INCLUDE 环境变量
还有LIB 环境变量
环境变量配置好后,我们来写个java代码 来测试一下
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
编译运行
javac HelloWorld.java
native-image HelloWorld
可以看到目录出现了exe 文件 我们直接运行exe 文件
运行成功
这不同于传统的java 运行方式,因为传统的方式需要先在电脑上安装jdk ,然后才能运行java class 文件,这个打包后的exe ,可以复制到没有安装jvm 的电脑运行。体积1也不大。远小于传统的jvm.还是挺方便的。
graalvm支持aop吗?
要知道jvm 一个很强的特性就是aop ,打包成二进制运行文件的graalvm 支持aop 吗?是的,GraalVM支持AOP(面向切面编程)。AOP是一种编程范式,用于将横切关注点(如日志记录、事务管理、安全性等)从核心业务逻辑中分离出来,以提高代码的可维护性和重用性。在GraalVM中,您可以使用Java的AOP框架,如AspectJ或Spring AOP,来实现AOP。这些框架允许您通过定义切面、切点和通知等概念,将横切关注点应用到您的代码中。GraalVM的即时编译器(Graal编译器)可以优化AOP代码,以提高其执行性能。此外,GraalVM还提供了与其他语言的互操作性,您可以在不同语言之间使用AOP。总之,GraalVM支持AOP,并且您可以使用Java的AOP框架来实现AOP编程,并通过GraalVM的优化来提高性能。现在spring 除了spring-native 我后面也和大家介绍一下。
总结
总之,graalvm 改变了传统的java 运行模式,打包体积更小,冷启动飞快,我测试启动spring项目,比传统的jvm 快了10倍!!,冷启动的内存占用也小很多。感觉有点像go 语言的打包方式,但是相对于go语言,java 有更好的生态和面向对象以及语法上面的优势。我觉得还是很值得使用的,比较适合的场景有javaFX 云计算 嵌入式等等。
喜欢我的话,可以给我点个赞呀。
原文始发于微信公众号(小羊架构):这款jvm你一定要试试
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/171701.html