服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Graalvm 替代 JVM 真的可以带来巨大的性能优势吗?

Graalvm 替代 JVM 真的可以带来巨大的性能优势吗?

2023-12-25 15:44互联网架构小马哥 Java教程

在本篇文章中,我们将对各种 Java 应用程序的性能进行比较分析,评估它们在 JVM 和 GraalVM 环境中的执行情况。

介绍

Spring Boot有助于轻松开发独立的、可用于生产的 Spring 应用程序。它对 Spring 平台和第三方库采用固执己见的方法:以最少的配置简化设置过程。优势:

  • 易于使用:Spring Boot 简化了独立 Spring 应用程序的创建,无需复杂的配置。
  • 嵌入式服务器:它允许直接嵌入 Tomcat、Jetty 或 Undertow 等服务器,从而无需单独部署 WAR 文件。
  • Starter 依赖项:Spring Boot 提供预配置的“starter”依赖项,降低了构建配置的复杂性。
  • 自动配置:Spring Boot 自动配置 Spring 和第三方库,最大限度地减少手动设置工作。
  • 生产就绪功能:它提供生产就绪功能,例如指标、运行状况检查和外部化配置,确保应用程序稳健且可扩展。
  • 无需代码生成或 XML 配置:Spring Boot 运行时无需生成任何代码,无需 XML 配置文件,从而提高了开发效率。

在常见的部署中,用 Java 编写的 Spring Boot 应用程序被编译成默认在 Java 虚拟机 (JVM) 中运行的字节码。还有另一种鲜为人知的运行 Java 应用程序的方式:Native application

GraalVM通过提前将 Java 应用程序编译成紧凑的独立二进制文件,彻底改变了 Java 应用程序。这些二进制文件展现出明显的优势,启动速度比传统 Java 应用程序快近 100 倍。它们无需预热即可提供峰值性能,同时与 Java 虚拟机 (JVM) 同类产品相比,消耗的内存和 CPU 资源显着减少。

GraalVM 并不局限于理论创新领域;它受到 Spring Boot、Micronaut、Helidon 和 Quarkus 等主要微服务框架的支持。此外,Oracle Cloud Infrastructure、Amazon Web Services、Google Cloud Platform 和 Microsoft Azure 等领先的云平台完全支持 GraalVM 集成。

通过利用配置文件引导的优化和先进的 G1(垃圾优先)垃圾收集器,GraalVM 使我们的应用程序具有更低的延迟。事实上,它提供的性能指标与在 Java 虚拟机 (JVM) 上运行的应用程序的性能指标相当或更强。这种速度、效率和安全性的卓越结合使 GraalVM 成为现代 Java 开发的改变游戏规则的选择。

过去,有很多使用 GraalVM 对 Java 应用程序进行基准测试的请求,期望 GraalVM 能够超越传统的 Java 虚拟机 (JVM)。

在本篇文章中,我们将对各种 Java 应用程序的性能进行比较分析,评估它们在 JVM 和 GraalVM 环境中的执行情况。

我们将通过在 JVM(Java 虚拟机)和 GraalVM 上执行基本的“hello world”应用程序进行比较分析。通过这个比较,我们旨在探索 GraalVM 相对于传统 JVM 的优越性能。

测试设置

所有测试均在具有 16G RAM 的 MacBook M1 上执行。软件版本有:

  • JDK 21
  • Graalvm JDK 21
  • SpringBoot 3.1.4

应用程序代码是一个包含单个路由的简单文件:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping("/")
    public String handleRequest() {
        return "Hello World!";
    }
}

为了构建原生镜像,我们使用了 MVN 的原生插件:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <project 
  3.  xmlns="http://maven.apache.org/POM/4.0.0" 
  4.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
  6.  <modelVersion>4.0.0</modelVersion> 
  7.  <parent> 
  8.   <groupId>org.springframework.boot</groupId> 
  9.   <artifactId>spring-boot-starter-parent</artifactId> 
  10.   <version>3.1.4</version> 
  11.   <relativePath/> 
  12.   <!-- lookup parent from repository --> 
  13.  </parent> 
  14.  <groupId>com.example</groupId> 
  15.  <artifactId>demo</artifactId> 
  16.  <version>0.0.1-SNAPSHOT</version> 
  17.  <name>demo</name> 
  18.  <description>Demo project for Spring Boot</description> 
  19.  <properties> 
  20.   <java.version>21</java.version> 
  21.  </properties> 
  22.  <dependencies> 
  23.   <dependency> 
  24.    <groupId>org.springframework.boot</groupId> 
  25.    <artifactId>spring-boot-starter-web</artifactId> 
  26.   </dependency> 
  27.   <dependency> 
  28.    <groupId>org.springframework.boot</groupId> 
  29.    <artifactId>spring-boot-starter-test</artifactId> 
  30.    <scope>test</scope> 
  31.   </dependency> 
  32.  </dependencies> 
  33.  <build> 
  34.   <plugins> 
  35.    <plugin> 
  36.     <groupId>org.springframework.boot</groupId> 
  37.     <artifactId>spring-boot-maven-plugin</artifactId> 
  38.     <configuration> 
  39.      <mainClass>com.example.demo.DemoApplication</mainClass> 
  40.      <layout>JAR</layout> 
  41.     </configuration> 
  42.    </plugin> 
  43.    <plugin> 
  44.     <groupId>org.apache.maven.plugins</groupId> 
  45.     <artifactId>maven-shade-plugin</artifactId> 
  46.     <version>3.5.0</version> 
  47.     <executions> 
  48.      <execution> 
  49.       <phase>package</phase> 
  50.       <goals> 
  51.        <goal>shade</goal> 
  52.       </goals> 
  53.      </execution> 
  54.     </executions> 
  55.    </plugin> 
  56.   </plugins> 
  57.  </build> 
  58.  <profiles> 
  59.   <profile> 
  60.    <id>native</id> 
  61.    <build> 
  62.     <plugins> 
  63.      <plugin> 
  64.       <groupId>org.graalvm.buildtools</groupId> 
  65.       <artifactId>native-maven-plugin</artifactId> 
  66.       <version>0.9.27</version> 
  67.       <extensions>true</extensions> 
  68.       <executions> 
  69.        <execution> 
  70.         <id>build-native</id> 
  71.         <goals> 
  72.          <goal>compile-no-fork</goal> 
  73.         </goals> 
  74.         <phase>package</phase> 
  75.        </execution> 
  76.        <execution> 
  77.         <id>test-native</id> 
  78.         <goals> 
  79.          <goal>test</goal> 
  80.         </goals> 
  81.         <phase>test</phase> 
  82.        </execution> 
  83.       </executions> 
  84.       <configuration> 
  85.        <!-- ... --> 
  86.       </configuration> 
  87.      </plugin> 
  88.     </plugins> 
  89.    </build> 
  90.   </profile> 
  91.  </profiles> 
  92. </project> 

原生二进制大小约为76M:

76M /Users/mayankc/Work/source/perfComparisons/java/springboot/target/demo

结果

每个包含500万个请求的测试分别针对50、100和300个并发连接执行。对于负载测试,我们使用了 Bombardier 测试工具。

以下是表格形式的测试结果:

Graalvm 替代 JVM 真的可以带来巨大的性能优势吗?

Graalvm 替代 JVM 真的可以带来巨大的性能优势吗?

Graalvm 替代 JVM 真的可以带来巨大的性能优势吗?

统计

为了更直观的展示测试结果,我们使用以下公式从结果中生成记分卡。对于每一个测量,结果获胜的按照领先度得分:

  • <5%,不给分
  • 5%到20%之间,获胜者得1分
  • 在20%到50%之间,获胜者得2分
  • >50%,获胜者得3分

以下是评分结果:

Graalvm 替代 JVM 真的可以带来巨大的性能优势吗?

结论

选择一个简单的 hello world 案例可能不是真正释放 GraalVM 或本机代码编译潜力的最合适场景。本地运行的相同 SpringBoot 应用程序的性能并没有明显优于其 JVM 对应项。GraalVM 唯一显着的优势在于其对内存的高效利用。

本文仅从性能方面对 GraalVM 和 传统 JVM 做了比较,参考以上测试结果,如果我们想要优化程序启动速度和对内存的利用率方面,GraalVM 会是更好的选择,至于其他性能指标,优势并不明显!

随着 GraalVM 在国内的推广和应用越来越广泛,相信它将会在未来的软件开发领域发挥越来越重要的作用,我们期待它之后的表现!

原文地址:https://www.toutiao.com/article/7287460124388557371/

延伸 · 阅读

精彩推荐