SpringBoot3中的性能提升介绍

news/2024/11/25 19:01:23/

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 中,这一特性得到了进一步的优化和增强。

java">@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 属性,可以禁用特定的自动配置类。

java">@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。

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

2. 使用原型范围的 Bean

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

java">@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 注解来启用异步支持。

java">@SpringBootApplication
@EnableAsync
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}@Service
public class AsyncService {@Asyncpublic void executeAsyncTask() {// 异步执行的任务}
}

2. 使用 CompletableFuture

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

java">public class AsyncController {@Autowiredprivate 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.ppmy.cn/news/1549884.html

相关文章

PySpark3:pyspark.sql.functions常见的60个函数

目录 一、常见的60个函数 1、col 2、lit 3、sum 4、avg/mean 5、count 6、max 7、min 8、concat 9、substring 10、lower 11、upper 12、trim 13、ltrim 14、rtrim 15、split 16、explode 17、collect_list 18、collect_set 19、asc 20、desc 21、when 2…

ESP8266 AP模式TCP服务器 电脑手机网络调试助手

AP模式TCP服务器和手机电脑网络调试助手多连接

H.265流媒体播放器EasyPlayer.js H5流媒体播放器关于如何查看手机端的日志信息并保存下来

现今流媒体播放器的发展趋势将更加多元化和个性化。人工智能的应用将深入内容创作、用户体验优化等多个方面&#xff0c;带来前所未有的个性化体验。 EasyPlayer.js H.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#…

Python棉花病虫害图谱系统CNN识别+AI问答知识neo4j vue+flask深度学习神经网络可视化

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 功能介绍 编号&#xff1a;F045 &#x1fab2; vueflaskneo4jmysql 架构 &#xff08;前后端分离架构&#xff09; &#x1fab2; 棉花…

Linux 进程概念与进程状态

目录 1. 冯诺依曼体系结构2. 操作系统&#xff08;Operator System&#xff09;2.1 概念2.2 设计OS的目的2.3 系统调用和库函数概念 3. 进程概念3.1 描述进程 - PCB3.2 task_struct3.3 查看进程3.4 通过系统调用获取进程标识符PID&#xff0c; PPID3.5 通过系统调用创建fork 4.…

应急响应:玄机_Linux后门应急

https://xj.edisec.net/challenges/95 11关做出拿到万能密码&#xff0c;ATMB6666&#xff0c;后面都在root权限下操作 1、主机后门用户名称&#xff1a;提交格式如&#xff1a;flag{backdoor} cat /etc/passwd&#xff0c;发现后门用户 flag{backdoor} 2、主机排查项中可以…

IDEA 添加外部.jar包。maven本地仓库录入新jar包。IDEA maven 命令巧妙使用。

这总方式有个好处&#xff0c;在打包和今后的引用都无需担心。 今天拿到一个别人的demo&#xff0c;需要把里面的jar导入到我的项目里面。 在IDEA maven工具面板中&#xff1a; 得到一个弹窗 因为输入框中已经有了mvn&#xff0c;所有我们写命令的时候直接忽略mvn指令 这里输…

极简AI工具箱网站开源啦!

开源地址&#xff1a;https://gitee.com/toolsj-open/go 反正也经营不下去了&#xff0c;一点流量都没有。虽然谈不上精品&#xff0c;但是我也用心做了。开源出来供学习吧&#xff0c;下面是详细文档&#xff1a; 相关仓库 mysql表结构&#xff1a;https://gitee.com/tools…