Spring Boot 性能提升的核武器,速度提升 500%!

科技   2024-12-10 15:02   安徽  

👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;

截止目前,累计输出 72w+ 字,讲解图 3088+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2500+小伙伴加入

虚拟线程是 Java 21 引入的一个新特性,用于简化并发编程。它与传统的操作系统线程相比,具有显著的优势:

  1. 轻量级:虚拟线程由 JVM 管理,而非操作系统,因此它们的内存占用和创建成本远低于传统线程。理论上,你可以轻松创建数十万甚至更多的虚拟线程。
  2. 高并发性:虚拟线程能处理更高并发的场景,特别是 I/O 密集型的应用,适合开发高并发、响应式的应用程序。
  3. 自动管理:无需手动管理线程池,JVM 会根据负载自动调整虚拟线程的调度,简化了并发编程的复杂性。

虚拟线程的基础用法

创建虚拟线程非常简单。你可以像创建传统线程一样启动虚拟线程,但它的创建与启动更加轻量:

Thread virtualThread = Thread.ofVirtual().start(() -> {
    System.out.println("虚拟线程正在运行");
});
System.out.println("主线程正在运行");

虚拟线程的延迟启动:

Thread virtualThread = Thread.ofVirtual()
    .name("虚拟线程")
    .unstarted(() -> System.out.println("虚拟线程运行中"));

virtualThread.start();
virtualThread.join(); // 等待虚拟线程完成

在Spring Boot中使用虚拟线程

在 Spring Boot 项目中使用虚拟线程需要一些简单的配置:

图片
  1. 确保 Java 版本为 21 或以上
  2. pom.xml 中启用 --enable-preview,以便支持虚拟线程特性。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>21</source>
        <target>21</target>
        <compilerArgs>
            <arg>--enable-preview</arg>
        </compilerArgs>
    </configuration>
</plugin>
  1. application.properties 中启用性能监控工具:
management.endpoints.web.exposure.include=health,info,metrics
  1. 在 Spring Boot 中为 Tomcat 配置虚拟线程执行器:
@Bean
public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
    return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
}

实验:传统线程 vs 虚拟线程

1. 创建100,000个线程并执行

传统线程

for (int i = 0; i < 100_000; i++) {
    Thread thread = new Thread(() -> System.out.println(i));
    thread.start();
    thread.join();
}

执行耗时约 18.6 秒

虚拟线程

for (int i = 0; i < 100_000; i++) {
    Thread thread = Thread.ofVirtual().unstarted(() -> System.out.println(i));
    thread.start();
    thread.join();
}

执行耗时仅 3.7 秒,性能提升了近 500%

2. HTTP 请求性能对比

在高并发场景下,虚拟线程的优势尤为明显。我们对比了传统线程与虚拟线程在处理 HTTP 请求时的表现。

配置 HTTP 线程执行器

@Bean
public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
    return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
}

请求测试:发送 1600 个 HTTP 请求,400 并发。

  1. 传统线程


  • 请求耗时:9.659 秒
  • 每秒请求数:165.65
  • 虚拟线程


    • 请求耗时:7.912 秒
    • 每秒请求数:202.22

    虚拟线程的吞吐量大幅提升,响应时间显著缩短。

    Java性能提升的其他技巧

    除了虚拟线程,Java 还有一些其他的性能提升技巧,尤其适用于 Spring Boot 高并发场景:

    1. 使用并行流:对于 CPU 密集型任务,可以使用并行流(parallelStream())来利用多核 CPU,提高处理速度。
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    numbers.parallelStream().forEach(number -> {
        System.out.println(number * 2);
    });
    1. 异步编程与CompletableFuture:对于 I/O 密集型任务,可以使用 CompletableFuture 进行异步处理,减少线程阻塞,提高响应性能。
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        // 异步执行任务
        System.out.println("异步任务完成");
    });
    future.join();  // 等待任务完成
    1. 优化数据库查询:减少数据库查询的次数,使用缓存(如 Redis)来存储频繁查询的数据,减少不必要的 I/O 操作。
    2. 内存管理优化:通过使用对象池(如 Apache Commons Pool)来管理资源,减少频繁的对象创建和销毁,提高内存使用效率。

    小结

    1. 虚拟线程 是 Java 并发编程的革新,它简化了线程管理,提升了高并发场景下的性能。
    2. 使用虚拟线程,你可以轻松创建数十万甚至更多线程,而不会影响应用的性能。
    3. 在 Spring Boot 中配置虚拟线程非常简单,只需几行代码即可启用虚拟线程,带来显著的性能提升。
    4. 除了虚拟线程,其他优化技巧(如并行流、异步编程、数据库查询优化等)也能有效提升 Java 应用的性能。

    通过这些技巧,Spring Boot 应用能够在高并发场景下表现出更强的性能和更低的响应延迟。

    👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

    • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍
    • 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;

    截止目前,累计输出 72w+ 字,讲解图 3088+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2500+小伙伴加入


    1. 我的私密学习小圈子,从0到1手撸企业实战项目!

    2. Nginx 性能优化全方案:打造一个高效服务器

    3. 如何设计一个高并发系统?

    4. 腾讯低代码平台正式开源!可拖拽生成手机项目、PC项目、TV项目!接私活福利啊!

    最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

    获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

    PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。

    “在看”支持小哈呀,谢谢啦

    小哈学Java
    码龄9年,前某厂中台研发。专注于Java领域干货分享,不限于BAT面试, 算法,数据库,Spring Boot, 微服务,高并发, JVM, Docker容器,ELK相关知识,期待与您一同进步。
     最新文章