JVM-对-GraalVM-的性能代替-渺小的优化或微无余道的变动 (jvm对象从创建到销毁的过程)
引见
SpringBoot有助于轻松开发独立的、可用于消费的Spring运行程序。它对Spring平台和第三方库驳回执著己见的方法:以起码的性能简化设置环节。长处:
在经常出现的部署中,用编写的SpringBoot运行程序被编译成自动在Java虚构机(JVM)中运转的字节码。还有另一种不为人知的运转Java运行程序的方式:Nativelication
GraalVM经过提早将Java运行程序编译成紧凑的独立二进制文件,彻底扭转了Java运行程序。 这些二进制文件展现出清楚的长处,启动速度比传统Java运行程序快近100倍。 它们无需预热即可提供峰值性能,同时与Java虚构机(JVM)同类产品相比,消耗的内存和CPU资源显着缩小。
GraalVM并不局限于通常翻新畛域;它遭到SpringBoot、Micronaut、Helidon和Quarkus等关键微服务框架的支持。此外,OracleCloudInfrastructure、AmazonWebServices、CloudPlatform和MicrosoftAzure等上游的云平台齐全支持GraalVM集成。
经过应用性能文件疏导的优化和先进的G1(渣滓优先)渣滓搜集器,GraalVM使咱们的运行程序具备更低的提早。理想上,它提供的性能目的与在Java虚构机(JVM)上运转的运行程序的性能目的相当或更强。这种速度、效率和安保性的出色联合使GraalVM成为现代Java开发的扭转游戏规定的选用。
过去,有很多经常使用GraalVM对Java运行程序启动基准测试的恳求,希冀GraalVM能够逾越传统的Java虚构机(JVM)。
在本篇文章中,咱们将对各种Java运行程序的性能启动比拟剖析,评价它们在JVM和GraalVM环境中的口头状况。
咱们将经过在JVM(Java虚构机)和GraalVM上口头基本的helloworld运行程序启动比拟剖析。经过这个比拟,咱们旨在探求GraalVM相关于传统JVM的优越性能。
测试设置
一切测试均在具备16GRAM的BookM1上口头。软件版本有:
运行程序代码是一个蕴含单个路由的繁难文件:
packagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.http.ResponseEntity;importorg.springframework.http.HttpStatus;importorg.springframework.web.bind.annotation.RestController;@SpringBootApplication@RestControllerpublicclassDemoApplication{publicstaticvoidmn(String[]args){SpringApplication.run(DemoApplication.class,args);}@GetMapping("/")publicStringhandleRequest(){return"HelloWorld!";}}
为了构建原生镜像,咱们经常使用了MVN的原生插件:
<?xml?><projectxmlns="http://maven..org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.4</version><relativePath/></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>DemoprojectforSpringBoot</description><properties><java.version>21</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.example.demo.DemoApplication</mainClass><layout>JAR</layout></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.5.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions></plugin></plugins></build><profiles><profile><id>native</id><build><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><version>0.9.27</version><extensions>true</extensions><executions><execution><id>build-native</id><goals><goal>compile-no-fork</goal></goals><phase>package</phase></execution><execution><id>test-native</id><goals><goal>test</goal></goals><phase>test</phase></execution></executions><configuration></configuration></plugin></plugins></build></profile></profiles></project>
原生二进制大小约为76M:
76M/Users/mayankc/Work/source/perfComparisons/java/springboot/target/demo
结果
每个蕴含500万个恳求的测试区分针对50、100和300个并发衔接口头。关于负载测试,咱们经常使用了Bombardier测试工具。
以下是表格方式的测试结果:
统计
为了更直观的展现测试结果,咱们经常使用以下公式从结果中生成记分卡。关于每一个测量,结果获胜的依照上游度得分:
以下是评分结果:
论断
选用一个繁难的helloworld案例或许不是真正监禁GraalVM或本机代码编译后劲的最适合场景。本地运转的相反SpringBoot运行程序的性能并没有清楚优于其JVM对应项。GraalVM惟一显着的长处在于其对内存的高效应用。
本文仅从性能方面对GraalVM和传统JVM做了比拟,参考以上测试结果,假设咱们想要优化程序启动速度和对内存的应用率方面,GraalVM会是更好的选用,至于其余性能目的,长处并不清楚!
随着GraalVM在国际的推行和运行越来越宽泛,置信它将会在未来的软件开发畛域施展越来越关键的作用,咱们等候它之后的体现!
GraalVM - 统治所有语言的魔戒
在编程世界中,GraalVM如同一枚璀璨的魔戒,悄然引领了多语言应用的革新。这款高效全能的虚拟机于2019年横空出世,致力于简化Java程序的执行与跨平台部署,它的出现犹如一股清流,挑战了传统JVM的界限。
GraalVM的核心魅力在于其先进的JIT(即时编译器)技术,它能对Java程序进行深度优化,显著提升运行速度,无需依赖庞大的JRE或繁琐的Web服务器。更令人瞩目的是,AOT( Ahead-of-Time编译)编译功能,使得Java程序能在不同平台上以原生代码的形式运行,从而大幅减少启动时间和资源消耗,这对于资源管理苛刻的Serverless和微服务场景尤其重要。
然而,尽管在轻量级语言环境中,如、Go或Python,GraalVM可能不占绝对优势,但它的强大性能和优化能力使得Java开发者在追求效率与灵活性的道路上有了新的选择。通过gu native-image命令,开发者可以利用AOT功能,体验到代码启动速度的显著提升和内存占用的显著降低。但值得注意的是,AOT编译并非全无限制,动态类加载、JNI、内存访问和某些高级特性如Finalizers、序列化和安全管理器在AOT下并不完全支持。
在安全性方面,GraalVM默认关闭了Java中的安全检查,如checkConnect和checkPermission。Substrave VM则进一步简化,不支持JVMTI、JMX和Java虚拟机工具接口。反射、引用类型和Java反射功能的使用需要通过特定的JSON配置。尽管如此,GraalVM AOT为微服务开发,如Quarkus和Micronaut,提供了一个全新的起点,尤其在构建高性能、轻量级的应用时,它的价值不容忽视。
想要深入了解GraalVM的更多细节,官方文档和GitHub仓库(和/oracle/graal)是你不可或缺的资源。同时,社区(/community)也是技术交流和分享的宝库。现在,就让GraalVM这枚魔戒,引领你的代码世界,走向前所未有的性能与效率吧!
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。