今天我们要介绍的是spring-native,它可以让你的spring引导程序体验到graalvm编译器的特性,直接把你的应用编译成native!
不需要安装jre,你的应用会像exe一样直接在目标机器上运行!并且启动时间小于1秒。
为了体验这个功能,我们从spring boot获取了一个演示。
https://start.spring.io/
在这里选择这个实验函数SpringNative。下载后,可以使用maven进行打包测试。
mvn spring-boot :构建-映像
gradle bootBuildImage
看这无敌的起步速度.0.038秒.几乎是瞬间!
太神奇了!
所有这些都要感谢graalvm编译器。但是,您必须将JDK升级到至少11才能使用它,这对于Java8用户来说是一个不同的驱动程序。
当然,Spring Native只在2.4.5之后的SpringBoot版本中受支持。
GraalVM是什么?
Graalvm也是一个oracle项目,它的代码地址是:
mvn spring-boot :构建-映像
gradle bootBuildImage
项目地址为:
www.graalvm.org/docs/
Graalvm是一个想要统一世界的虚拟机。因为和HotSpotVM相比,它还可以运行ruby、python、php等其他语言。
这是一个新的Jvm。不同的是,由于自适应,它可以使不同的语言在同一个虚拟机下运行。
请看下图,看看graalvm有多狂野。
这还不是全部。它最吸引人的地方是可以直接将应用程序代码打包成原生的二进制可执行代码,运行时甚至不需要JVM!
众所周知,原生和在vm中运行完全是两个等级,否则就不会有jit这样牛逼的技术。就连安卓和ios都知道,原生的应用流畅性远高于monotouch或hybrid,这个功能对于追求性能的企业应用来说更实用。
令人惊讶的是,它已经成为所有语言交流的桥梁。例如,我看好js中的一个库。我不需要重新开发一个。我可以直接在Java中使用。这是因为graalVM开发了跨语言互操作协议,可以保证跨语言的互操作性。
大多数平台现在都支持该功能。
公共类示例{
公共静态void main(String[]args){ 0
String str=“原生映像很棒”;
字符串反转=反转字符串(str);
System.out.println('反转的字符串为: '反转);
}
公共静态字符串反转
if (str.isEmpty())
返回字符串;
返回reverseString(str . substring(1))str . charat(0);
}
}
通常,我们直接运行这个,或者将其打包到jar包中。
贾维克Example.java
java示例
但是我们可以更进一步,即原生类文件。
本地图像示例
执行时,只需输入。/示例。
有什么好处?
本机编译的应用程序可以在几秒钟内启动,运行速度更快,占用的内存更少。更符合微服务、k8s等主流部署方式。
但是,它在很多方面都不同于传统的JVM,主要表现在以下几个方面:
系统的性能分析将在编译阶段给出。
由于以前java版本的模块化,未使用的部分和代码将不会被编译,并将被直接删除。
反射、资源和动态代理需要提前转换,没有类加载的延迟。
路径在编译时是固定的。
类不会偷懒加载,而是会在启动时放入内存。
原生虽然有很多优点,但是编译时间很长,因为需要做大量的代码静态分析,这也是所有原生程序的通病。
End
这种细罐子思维是不是觉得Java的发展越来越像golang了?Docker映像会因为这个变化而变得更小更纯粹,没有jre的Java应用会越来越像一个真实的程序。
遗憾的是,这种编译成native的想法虽然好,但现阶段还是无法与golang抗衡,主要是因为编译器的差异。
希望graalvm能继续发力,继续用java飞几十年,支持我的三代!
下一篇:如何找到适合网站优化的内容_