当前位置: 首页 > article >正文

SpringBoot3中的性能提升介绍

Spring Boot 3 是对 Spring Boot 框架的一个重要更新版本,它延续了 Spring Boot 简化 Spring 应用程序开发的宗旨,同时进一步提升了开发者体验和应用程序性能。本文将详细介绍 Spring Boot 3 中性能优化的提升,包括具体的代码示例,内容将涵盖多个方面,如启动时间的优化、内存占用的减少、异步执行、日志管理等。

一、启动时间的优化

启动时间的优化是 Spring Boot 性能提升的重要方面。Spring Boot 3 引入了多种策略来减少应用的启动时间。

1. 精简依赖

Spring Boot 的一个显著特点是其“开箱即用”的特性,通过引入不同的starter 依赖来快速添加功能。然而,过多的依赖会显著增加应用的启动时间。因此,精简依赖成为了优化启动时间的第一步。

  • 删除不必要的依赖:定期审查项目中的依赖,移除那些不再使用或可选的库。
  • 按需加载:尽量采用懒加载策略,避免在应用启动时加载所有的依赖。
<!-- pom.xml -->
<!-- 示例: 移除不需要的 Spring Boot Starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 使用 Lazy Initialization

Spring Boot 2.2 引入了 lazy initialization 特性,通过设置 spring.main.lazy-initialization=true 可以延迟 Bean 的初始化,从而减少启动时间。在 Spring Boot 3 中,这一特性得到了进一步的优化和增强。

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.setLazyInitialization(true); // 启用懒加载
        app.run(args);
    }
}

3. 禁用特定的自动配置类

Spring Boot 的自动配置机制极大地方便了开发,但在某些情况下,自动配置可能会加载一些不必要的 Bean,从而增加启动时间。通过使用 @SpringBootApplication 注解中的 exclude 属性,可以禁用特定的自动配置类。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

4. AOT (Ahead-of-Time) 编译

Spring Boot 3 引入了 AOT 编译,通过在编译时进行更多的工作,可以大幅缩短应用的启动时间。AOT 编译生成的代码更加紧凑和高效,减少了运行时的开销。

<!-- pom.xml -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aot</artifactId>
</dependency>

5. 配置 JVM 参数

JVM 参数的配置对启动时间有显著影响。通过调整堆大小、垃圾收集器类型等参数,可以优化启动时间。

java -Xmx512m -Xms512m -jar myapp.jar

6. 使用 GraalVM Native Image

GraalVM 是一个高性能的通用虚拟机,它允许开发者将 Java 应用程序编译成原生镜像,从而显著减少启动时间和内存占用。

<!-- pom.xml -->
<dependency>
    <groupId>org.graalvm.nativeimage</groupId>
    <artifactId>native-image-maven-plugin</artifactId>
    <version>22.2.0</version>
    <executions>
        <execution>
            <goals>
                <goal>native-image</goal>
            </goals>
            <configuration>
                <imageName>myapp</imageName>
                <mainClass>com.example.MyApplication</mainClass>
            </configuration>
        </execution>
    </executions>
</dependency>

二、内存占用的减少

减少内存占用也是性能优化的重要方面。Spring Boot 3 提供了多种策略来降低内存使用。

1. 精简配置和 Bean

每一个 Spring Bean 都会占用一定的内存,过多的 Bean 会导致内存占用过高。精简配置,仅保留必须的配置和 Bean,避免使用不必要的 Bean。

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

2. 使用原型范围的 Bean

对于不频繁使用的 Bean,可以考虑将其定义为原型范围(Prototype Scope),以减少内存占用。

@Component
@Scope("prototype")
public class HeavyService {
    // ...
}

3. 优化 JVM 参数

JVM 参数的配置对内存使用有着直接的影响。通过调整堆大小、垃圾收集器类型等参数,可以优化内存的使用效率。

java -Xmx512m -Xms512m -XX:+UseG1GC -jar myapp.jar

4. 使用 GraalVM Native Image

GraalVM Native Image 通过静态编译技术消除了动态类加载的开销,使得应用在运行时更加稳定和高效。

<!-- pom.xml -->
<dependency>
    <groupId>org.graalvm.nativeimage</groupId>
    <artifactId>native-image-maven-plugin</artifactId>
    <version>22.2.0</version>
    <executions>
        <execution>
            <goals>
                <goal>native-image</goal>
            </goals>
            <configuration>
                <imageName>myapp</imageName>
                <mainClass>com.example.MyApplication</mainClass>
            </configuration>
        </execution>
    </executions>
</dependency>

三、异步执行

异步执行是提高应用性能的重要手段,它允许应用在不阻塞主线程的情况下执行耗时的任务。

1. 使用 @Async 注解

Spring Boot 提供了 @Async 注解,用于标记异步执行的方法。需要在启动类上添加 @EnableAsync 注解来启用异步支持。

@SpringBootApplication
@EnableAsync
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@Service
public class AsyncService {
    @Async
    public void executeAsyncTask() {
        // 异步执行的任务
    }
}

2. 使用 CompletableFuture

JDK 8 提供了 CompletableFuture 类,它表示一个异步操作的结果。可以使用 supplyAsyncrunAsync 方法来执行异步任务。

public class AsyncController {
    @Autowired
    private AsyncService asyncService;

    @GetMapping("/async")
    public CompletableFuture<String> handleAsyncRequest() {
        return CompletableFuture.supplyAsync(() -> {
            asyncService.executeAsyncTask();
            return "Async task completed";
        });
    }
}

四、日志管理

合理的日志管理不仅可以帮助开发者调试和监控应用,还可以减少不必要的日志输出,提高应用性能。

1. 配置日志级别

将日志级别调整到合理的水平可以提高启动速度。例如,将根日志级别设置为 WARN 可以减少日志输出。

# application.properties
logging.level.root=WARN
logging.level.com.example=DEBUG
logging.file.name=app.log

2. 使用 Logback 或 Log4j2

Spring Boot 支持 Logback 和 Log4j2 作为日志框架。可以根据项目需求选择合适的日志框架,并进行详细配置。

<!-- logback-spring.xml -->
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="WARN">
        <appender-ref ref="STDOUT" />
    </root>
    <logger name="com.example" level="DEBUG" />
</configuration>

总结

Spring Boot 3在性能优化上取得了显著提升,主要聚焦在启动时间优化、内存占用减少、异步执行和日志管理四个方面。通过精简依赖、使用Lazy Initialization、禁用特定自动配置类等策略,有效缩短了应用启动时间。同时,通过精简配置和Bean、使用原型范围的Bean以及优化JVM参数,降低了内存占用。异步执行方面,Spring Boot 3提供了@Async注解和CompletableFuture类,提高了应用处理耗时任务的能力。此外,合理的日志管理也通过配置日志级别和选择合适的日志框架,为性能优化贡献了力量。这些改进使得Spring Boot 3成为开发者构建高性能Spring应用程序的理想选择。


http://www.kler.cn/a/409457.html

相关文章:

  • Python学习——字符串操作方法
  • 详细探索xinput1_3.dll:功能、问题与xinput1_3.dll丢失的解决方案
  • Redis 常用数据类型插入性能对比:循环插入 vs. 批量插入
  • 七天掌握SQL--->第五天:数据库安全与权限管理
  • 深入理解下oracle 11g block组成
  • ABC002D 派閥题解
  • Linux上安装单机版ElasticSearch6.8.1
  • 设计模式之创建模式篇
  • 签到送金币项目
  • 集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解
  • FastAPI和SQLModel结合的优点
  • 拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,特别是SVM
  • selenium grid 远程webdriver添加上网代理
  • 7-401 平均值
  • Git 提交的相对引用
  • 【Linux】安装cuda
  • 实验7 JavaScript编程基础7.1密码验证
  • go-web项目通用脚手架
  • 每天100w次登录请求,8G内存该如何设置JVM参数?
  • 论文解析:EdgeToll:基于区块链的异构公共共享收费系统(2019,IEEE INFOCOM 会议);layer2 应对:频繁小额交易,无交易费
  • 数据库-MySQL-Dynamic-Datasource源码解析
  • 鸿蒙征文|鸿蒙心路旅程:始于杭研所集训营,升华于横店
  • 网络安全 - SQL Injection
  • 【Python】数据抓取失败解析
  • Vue3-后台管理系统
  • 网络安全,文明上网(2)加强网络安全意识