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

devtools/2025/1/15 17:28:52/

虚拟线程是 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

  2. 虚拟线程:

    • 请求耗时: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 应用能够在高并发场景下表现出更强的性能和更低的响应延迟。


http://www.ppmy.cn/devtools/150729.html

相关文章

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

mysql 与Redis 数据强一致方案

前言mysql与Redis能实现数据的强一致?分布式实现数据的强一致的方案是什么?mysql 与 Redis 能强一致吗?Redis 的事务不适合实现强一致那怎么办?(mysql 与Redis 有强一致方案吗?) 前言 mysql与Redis一般不会使用强一致性因为不仅设计复杂并且性能差(典型的吃力不讨好类型)…

【深度学习】PyTorch:手写数字识别

在这个技术博客中,我们将一起探索如何使用PyTorch来实现一个手写数字识别系统。这个系统将基于经典的MNIST数据集,这是一个包含60,000个训练样本和10,000个测试样本的手写数字(0-9)数据库。通过这个项目,你将了解如何使用PyTorch进行深度学习模型的构建、训练和评估。 文…

【2025最新】Poe保姆级订阅指南,Poe订阅看这一篇就够了!最方便使用各类AI!

1.Poe是什么&#xff1f; Poe, 全称Platform for Open Exploration。 Poe本身并不提供基础的大语言模型&#xff0c;而是整合多个来自不同科技巨头的基于不同模型的AI聊天机器人&#xff0c;其中包括来自OpenAI的ChatGPT&#xff0c;Anthropic的Claude、Google的PaLM&#xf…

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中&#xff0c;可以通过设置定时触发器&#xff08;Schedules&#xff09;和脚本中的时间判断逻辑结合&#xff0c;确保任务只在每月 10 号的上午运行。 以下是实现的步骤&#xff1a; 1. 设置定时触发器 GitLab 提供了 Schedules 功能&#xff0c;可以指定每…

STM32入门教程-示例程序(按键控制LED光敏传感器控制蜂鸣器)

1. LED Blink&#xff08;闪烁&#xff09; 代码主体包含&#xff1a;LED.c key.c main.c delay.c&#xff08;延时防按键抖动&#xff09; 程序代码如下&#xff08;涉及RCC与GPIO两个外设&#xff09;&#xff1a; 1.使用RCC使能GPIO时钟 RCC_APB2PeriphClockC…

vector的模拟实现(C++)

一、构造函数 vector() //构造函数:_start(nullptr),_finish(nullptr),_endofstorage(nullptr) {}vector(int n, const T& val T())//构造函数:_start(nullptr), _finish(nullptr), _endofstorage(nullptr) {reserve(n);while (n--){push_back(val);} }template<cla…