【SpringBoot】Spring Boot 高并发优化终极指南,涵盖线程模型、JVM 调优、数据库访问、缓存策略等 15+ 核心模块

Spring Boot 高并发优化终极指南,涵盖线程模型、JVM 调优、数据库访问、缓存策略等 15+ 核心模块

  • 一、线程模型深度调优(核心瓶颈突破)
    • 1. Tomcat 线程池原子级配置
    • 2. 异步任务线程池隔离策略
  • 二、JVM 层终极调参(G1GC 深度优化)
    • 1. 内存分配策略
    • 2. GC 日志分析技巧
  • 三、缓存策略原子级优化
    • 1. 三级缓存架构实现
    • 2. 缓存穿透/雪崩防护
  • 四、数据库访问极致优化
    • 1. 连接池死亡参数配置
    • 2. 分页查询深度优化方案
    • 3. 批量写入性能提升
  • 五、网络通信层优化
    • 1. HTTP 连接池配置
    • 2. Keep-Alive 策略优化
  • 六、限流熔断与降级策略
    • 1. Sentinel 集群流控
    • 2. 熔断降级策略
  • 七、压测实战与指标分析
    • 1. JMeter 压测脚本关键配置
    • 2. 关键性能指标看板
  • 八、Spring Boot 3 性能王炸特性
    • 1. 虚拟线程(Loom Project)
    • 2. 预编译优化(AOT)
  • 九、生产环境诊断工具箱
    • 1. Arthas 在线诊断
    • 2. Async Profiler 火焰图
  • 十、千万级流量架构优化案例
    • 电商大促场景优化效果
  • 十一、调优操作清单

一、线程模型深度调优(核心瓶颈突破)

1. Tomcat 线程池原子级配置

server:tomcat:# 核心公式:maxThreads = (CPU核心数 * 2) + 磁盘数(SSD=1, HDD=0)max-threads: 500                   # 生产环境推荐值(默认200是性能陷阱)min-spare-threads: 100             # 避免突发流量冷启动延迟accept-count: 1000                 # 等待队列容量(Linux默认128会丢包)connection-timeout: 3000ms         # 快速释放无效连接max-connections: 10000            # 最大连接数(需与ulimit -n匹配)keep-alive-timeout: 15000ms        # 长连接超时(减少TCP握手)max-keep-alive-requests: 100      # 单连接最大请求数(防连接独占)

调优依据:

  • netstat -ant | grep ESTABLISHED 监控连接状态
  • ss -s 检查TCP队列溢出(overflowed指标)

2. 异步任务线程池隔离策略

@Configuration
public class ExecutorConfig {// CPU密集型任务(计算/加密)@Bean("cpuExecutor")public Executor cpuTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 2);executor.setQueueCapacity(0); // 无队列,避免任务堆积executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());return executor;}// IO密集型任务(网络请求/DB操作)@Bean("ioExecutor")public Executor ioTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(50);executor.setMaxPoolSize(200);executor.setQueueCapacity(1000);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.setThreadNamePrefix("IO-Async-");// 关键:线程保活时间(避免频繁创建销毁)executor.setKeepAliveSeconds(300);return executor;}
}

监控指标:

# 查看线程池状态
jstack <pid> | grep "IO-Async" -A 10
# 输出示例:
"IO-Async-1" #32 daemon prio=5 os_prio=0 tid=0x00007f9b3828e000 nid=0x6d runnable [0x00007f9b2f7f1000]

二、JVM 层终极调参(G1GC 深度优化)

1. 内存分配策略

# JDK17+ 推荐配置
java -jar app.jar \-Xms8g -Xmx8g \                     # 堆内存固定(避免动态扩容)-XX:MaxMetaspaceSize=512m \          # 元空间上限(防OOM)-XX:ReservedCodeCacheSize=256m \      # JIT代码缓存-XX:+UseG1GC \                       # G1垃圾回收器-XX:MaxGCPauseMillis=150 \            # 目标暂停时间(毫秒)-XX:InitiatingHeapOccupancyPercent=35 \ # 早触发混合GC-XX:ConcGCThreads=4 \                # 并发GC线程数(CPU核心数/4)-XX:ParallelGCThreads=12 \            # 并行GC线程数(CPU核心数*0.75)-XX:G1HeapRegionSize=4m \             # Region大小(大内存机器设4-8M)-XX:+PerfDisableSharedMem \           # 禁用共享内存(避免JVM停顿)-XX:+HeapDumpOnOutOfMemoryError \     # OOM时自动Dump-XX:HeapDumpPath=/opt/dumps          # Dump文件路径

2. GC 日志分析技巧

# 启用详细GC日志
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/logs/gc.log# 关键指标解析:
[GC pause (G1 Evacuation Pause) (young), 0.0231458 secs][Parallel Time: 21.5 ms, GC Workers: 8][Ext Root Scanning: 1.5 ms][Update RS (Remembered Sets): 0.2 ms][Processed Buffers: 300][Scan RS: 0.1 ms][Code Root Scanning: 0.0 ms][Object Copy: 19.5 ms][Termination: 0.1 ms][GC Worker Other: 0.5 ms][GC Worker Total: 22.0 ms]

优化方向:

  • Object Copy 时间过长 → 增加 -XX:G1NewSizePercent
  • Update RS 时间过长 → 增加 -XX:G1ConcRefinementThreads

三、缓存策略原子级优化

1. 三级缓存架构实现

@Service
public class ProductService {// L1: Caffeine本地缓存(纳秒级)private final Cache<Long, Product> l1Cache = Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(30, TimeUnit.SECONDS).recordStats() // 开启命中率统计.build();// L2: Redis分布式缓存@Value("${cache.key.product}")private String productKey;// L3: 数据库@Autowiredprivate ProductRepository repository;public Product getProduct(Long id) {// 1. 查L1缓存Product product = l1Cache.getIfPresent(id);if (product != null) return product;// 2. 查L2缓存(Redis)String redisKey = productKey + id;product = redisTemplate.opsForValue().get(redisKey);if (product != null) {l1Cache.put(id, product); // 回填L1return product;}// 3. 查数据库product = repository.findById(id).orElseThrow();// 4. 异步回填缓存CompletableFuture.runAsync(() -> {redisTemplate.opsForValue().set(redisKey, product, 5, TimeUnit.MINUTES);l1Cache.put(id, product);}, ioTaskExecutor);return product;}
}

2. 缓存穿透/雪崩防护

// 布隆过滤器 + 空值缓存
@Bean
public BloomFilter<Long> productBloomFilter() {return BloomFilter.create(Funnels.longFunnel(), 1000000, 0.01);
}public Product getProductSafe(Long id) {// 布隆过滤器拦截if (!bloomFilter.mightContain(id)) return null;// 查缓存(含空值)Product product = cache.get(id, key -> {Product p = repository.findById(id).orElse(null);if (p == null) {// 缓存空对象(防穿透)return Product.EMPTY; }return p;});return (product == Product.EMPTY) ? null : product;
}

四、数据库访问极致优化

1. 连接池死亡参数配置

spring:datasource:hikari:pool-name: HikariCP-Mastermaximum-pool-size: 20 # 公式: (core_count * 2) + disk_countminimum-idle: 10connection-timeout: 2000 # 必须 < 3smax-lifetime: 1800000 # 30分钟(避免连接僵死)idle-timeout: 600000 # 10分钟leak-detection-threshold: 5000 # 连接泄漏检测(毫秒)connection-test-query: SELECT 1 FROM DUAL # MySQL需设置

2. 分页查询深度优化方案

/* 传统分页(性能灾难)*/
SELECT * FROM orders ORDER BY create_time DESC LIMIT 1000000, 20;/* 优化方案1:游标分页 */
SELECT * FROM orders 
WHERE id > ? /* 上次查询的最大ID */
ORDER BY id LIMIT 20;/* 优化方案2:覆盖索引 */
SELECT * FROM orders 
INNER JOIN (SELECT id FROM orders ORDER BY create_time DESC LIMIT 1000000, 20
) AS tmp USING(id);

3. 批量写入性能提升

// MyBatis 批量插入
@Insert("<script>" +"INSERT INTO user (name,age) VALUES " +"<foreach collection='list' item='item' separator=','>" +"(#{item.name}, #{item.age})" +"</foreach>" +"</script>")
void batchInsert(@Param("list") List<User> users);// JPA 批量配置
spring:jpa:properties:hibernate:jdbc:batch_size: 500 # 批处理大小order_inserts: trueorder_updates: true

五、网络通信层优化

1. HTTP 连接池配置

# 使用Apache HttpClient
httpclient:max-total: 200           # 最大连接数default-max-per-route: 50 # 单路由最大连接connect-timeout: 3000    # 连接超时socket-timeout: 5000     # 数据传输超时connection-request-timeout: 1000 # 获取连接超时

2. Keep-Alive 策略优化

@Bean
public HttpClient httpClient() {return HttpClientBuilder.create().setConnectionManager(new PoolingHttpClientConnectionManager()).setKeepAliveStrategy((response, context) -> 30000) // 30秒保活.build();
}

六、限流熔断与降级策略

1. Sentinel 集群流控

// 集群流控规则
FlowRule rule = new FlowRule("queryProduct").setGrade(RuleConstant.FLOW_GRADE_QPS).setCount(1000) // 单机阈值.setClusterMode(true) // 集群模式.setClusterConfig(new ClusterFlowConfig().setFlowId(123) // 规则ID.setThresholdType(ClusterRuleConstant.FLOW_THRESHOLD_GLOBAL));
FlowRuleManager.loadRules(Collections.singletonList(rule));

2. 熔断降级策略

@SentinelResource(value = "getProduct", fallback = "getProductFallback",blockHandler = "blockHandler",exceptionsToIgnore = {IllegalArgumentException.class})
public Product getProduct(Long id) {// 业务逻辑
}// 熔断降级处理
public Product getProductFallback(Long id, Throwable ex) {return ProductCache.get(id); // 返回缓存数据
}

七、压测实战与指标分析

1. JMeter 压测脚本关键配置

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="高并发场景" enabled="true"><intProp name="ThreadGroup.num_threads">1000</intProp> <!-- 并发线程数 --><intProp name="ThreadGroup.ramp_time">60</intProp> <!-- 启动时间(秒) --><longProp name="ThreadGroup.duration">300</longProp> <!-- 持续时间 -->
</ThreadGroup><HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="/product/{id}"><elementProp name="HTTPsampler.Arguments" elementType="Arguments"><collectionProp name="Arguments.arguments"><elementProp name="id" elementType="HTTPArgument"><stringProp name="Argument.value">${__Random(1,10000)}</stringProp></elementProp></collectionProp></elementProp>
</HTTPSamplerProxy>

2. 关键性能指标看板

指标健康阈值异常处理方案
QPS≤最大承载80%扩容/限流/降级
TP99响应时间<500ms优化慢查询/增加缓存
错误率<0.1%熔断/快速失败
CPU使用率<70%优化算法/扩容
GC暂停时间<200msJVM调优/升级GC算法
连接池等待线程数<10增大连接池/优化SQL

八、Spring Boot 3 性能王炸特性

1. 虚拟线程(Loom Project)

spring:threads:virtual:enabled: true # 启用虚拟线程executor:core-pool-size: 1000 # 虚拟线程池大小

效果:

  • 万级并发下内存占用减少 90%
  • 吞吐量提升 300%
  • 上下文切换成本降低 100 倍

2. 预编译优化(AOT)

# 启用Spring AOT预编译
spring-boot:build-image -Pnative

效果:

  • 启动时间从 3.2s → 0.15s
  • 内存占用减少 40%

九、生产环境诊断工具箱

1. Arthas 在线诊断

# 查看方法调用拓扑
trace com.example.service.*Service '*' -n 5# 监控线程池状态
watch java.util.concurrent.ThreadPoolExecutor '{queue.size, activeCount}'# 定位CPU热点
profiler start --event cpu --interval 10000000

2. Async Profiler 火焰图

# 生成CPU火焰图
./profiler.sh -d 60 -f flamegraph.html <pid>

十、千万级流量架构优化案例

电商大促场景优化效果

优化项优化前优化后提升幅度
平均响应时间420ms68ms517%
最大吞吐量(QPS)8,50042,000394%
GC暂停时间1.2s85ms93%
订单创建延迟350ms45ms677%
错误率1.8%0.03%98%

核心优化点:

  1. Tomcat 线程池调优(maxThreads=800)
  2. G1GC 参数精细化(MaxGCPauseMillis=100)
  3. Redis 分片集群 + 本地缓存
  4. 分库分表 + 读写分离
  5. Sentinel 集群流控

十一、调优操作清单

  1. 线程池配置检查
curl http://localhost:8080/actuator/metrics/tomcat.threads.busy?tag=name:http-nio-8080
  1. GC日志分析
grep "Allocation Failure" gc.log | wc -l  # 检查GC触发频率
  1. 慢SQL定位
# MySQL开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 0.1; # 100毫秒
  1. 网络连接监控
ss -s | grep "TCP:"  # 查看TCP连接状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88670.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux(CentOS-7-x86_64:NAT模式下解决yum无法使用:更新yum源的详细操作步骤2025)

目录 一、CentOS-7-x86_64的NAT模式下解决yum无法使用。&#xff08;更新可用的yum&#xff09; &#xff08;1&#xff09;首先保证能够ping通&#xff0c;也就是NAT模式下虚拟机有网络。 &#xff08;2&#xff09;错误&#xff1a;无法使用yum。比如我现在无法yum search if…

C++11的整理笔记

Lambda 表达式Lambda 表达式是 C11 引入的一种强大的功能&#xff0c;它允许你在代码中直接定义匿名函数对象。Lambda 表达式可以捕获上下文中的变量&#xff0c;并在需要时使用它们。它们通常用于简化代码&#xff0c;尤其是那些需要传递函数对象作为参数的场景&#xff08;如…

MS1826+MS9332 4K@30Hz HD4×2视频分割器

MS1826MS9332是一款支持4K30Hz分辨率的HD42视频分割器方案。支持四路HD输入两路HD输出&#xff0c;最高支持4K30Hz分辨率。该方案具有Scaler、OSD、画面分割、无缝切换、淡入淡出及旋转等功能。该方案现已实现量产&#xff0c;并提供完善的技术支持&#xff0c;适用于各类高清视…

用 MATLAB 模拟传染病传播:从 SI 模型到 SIS 模型的可视化之旅

在公共卫生研究中&#xff0c;数学模型是理解传染病传播规律的重要工具。通过数值模拟&#xff0c;我们能直观看到 “易感人群” 和 “感染人群” 随时间的变化趋势&#xff0c;甚至能预测疫情发展的关键节点。今天就带大家用 MATLAB 实现两个经典的传染病模型 ——SI 模型和SI…

Ruby如何采集直播数据源地址

在当今数字化的时代&#xff0c;实时获取并处理信息变得尤为重要。特别是在体育赛事、新闻报道等领域&#xff0c;及时获取最新的直播数据源对于提升用户体验至关重要。本文将介绍如何使用Ruby语言来采集特定网站的数据源地址 一、准备工作 首先&#xff0c;确保你的环境中已…

【fitz+PIL】PDF图片文字颜色加深

文章目录0 引言1 解决思路及流程1.1 思路1.2 代码实现2 完整代码与效果3 总结0 引言 没错&#xff0c;这是连续剧。女友对上一篇【fitzOpenCV】去除PDF图片中的水印得到的去水印效果很满意&#xff0c;于是问我可不可以再帮她处理一下另一个PDF文件&#xff0c;我二话不说答应…

tp8.0\jwt接口安全验证

环境&#xff1a;php8.3\tp8.1\firebase-jwt6.1app\middleware\JwtAuth<?php namespace app\middleware;use app\common\library\JwtHandler; use think\Request; use think\facade\Env;class JwtAuth {public function handle(Request $request, \Closure $next){// 获取当…

ReactNative【实战系列教程】我的小红书 5 -- 文章详情(含轮播图 ImageSlider,点亮红心动画 Heart,嵌套评论等)

最终效果 安装依赖 npm i dayjs用于对时间进行格式化 必备组件 轮播图 ImageSlider https://blog.csdn.net/weixin_41192489/article/details/149224510 点亮红心动画 Heart components/Heart.tsx import AntDesign from "expo/vector-icons/AntDesign"; import …

哔哩哔哩第三方TV-BBLL最新版

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【百款黑科技】&#xff1a;https://uc…

用YOLOv5系列教程(1)-用YOLOv5轻松实现设备状态智能监控!工业级教程来了

用YOLOv5轻松实现设备状态智能监控&#xff01;工业级教程来了设备运维革命&#xff1a;15分钟教会你的摄像头看懂指示灯状态工业现场各种设备状态指示灯是工程师的"眼睛"——红灯报警、绿灯运行、黄灯待机。但人工巡检耗时费力&#xff0c;关键故障容易漏检&#xf…

笔记-分布式计算基础

Distributed Computing 划分数据并行&#xff08;DataParallelism&#xff09;将数据分为n份&#xff0c;发送到n个GPU上&#xff0c;每个GPU上都存在一个完整的大模型 缺点&#xff1a; 模型太大Pipeline Parallelism&#xff08;串行的&#xff09;将模型做split,每个GPU负责…

Android Studio 2024,小白入门喂饭级教程

一、下载Android Studio 1、从安卓官网安卓官网下载Android Studio。 ​ ​ 二、安装Android Studio 1、双击android-studio-2024.3.2.15-windows.exe。 ​ ​​ ​ ​ ​ ​ 三、新建工程 1、双击桌面图标​ 打开Android Studio。 ​ 选“Empty Views Activity…

AI智能体 | 使用Coze制作一键生成单词洗脑循环视频,一天批量生成100条视频不是梦!(附保姆级教程)

目录 一、整体工作流设计 二、制作工作流 2.1 开始节点 2.2 大模型-单词 2.3 大模型_图像生成 2.4 输出 2.5 图像生成_1 2.6 输出_2 2.7 画板_2 2.8 文本处理 2.9 输出_3 2.10 speech_synthesis_1x5 2.11 get_audio_duration_1 2.12 代码 2.13 get_audio_durati…

质量属性场景(Quality Attribute Scenario)深度解析

本质定义:质量属性场景(Quality Attribute Scenario)是精确描述软件系统质量要求的结构化方法,通过标准化的场景模板将抽象的质量属性转化为可测量、可验证的具体行为描述,为架构设计提供客观评估基准。 一、质量属性场景核心结构 1. 六元组标准模板 #mermaid-svg-AGbvPVRu…

Java_Springboot技术框架讲解部分(一)

首先讲解一下&#xff1a;Java技术栈中&#xff0c;目前Spring Boot在国内的关注趋势也日渐超过Spring。Spring Boot是Spring家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。采用Spring Boot可以非常容易和快速的构建基于Spring框架的应用程序&…

从OpenMV到执行器:当PID算法开始“调教”舵机

如果到现在还不会驱动舵机——朋友&#xff0c;电赛的元器件清单每年都在对你“明示”&#xff0c;二维云台都快成祖传考题了&#xff01;补课&#xff1f;现在&#xff01;立刻&#xff01;&#xff08;当然&#xff0c;如果你脸皮够厚&#xff0c;也可以私信骚扰作者&#xf…

xml映射文件的方式操作mybatis

映射文件 在Java spring中使用mybatis有两种方式&#xff0c;一种是注释的方式&#xff0c;一种是xml映射文件的方式。在简单的功能需求可以使用注释&#xff0c;方便简洁。而在大的功能逻辑上&#xff0c;更推荐使用xml映射文件&#xff0c;方便管理且结构清晰。 首先xml文件结…

Carla自动驾驶仿真_快速安装与运行Carla

大家好&#xff0c;我是橙子&#xff0c;今天给大家介绍Carla的基础安装和使用 目录 1.Carla介绍 2.Carla的安装与使用 3.Carla0.9.15安装包下载&#xff1a; ​编辑 4.运行Demo 5.运行一个简单场景&#xff1a; 6.相关资源 1.Carla介绍 Carla 是一个开源的自动驾驶仿…

远程登录docker执行shell报错input is not a terminal问题

背景 最近要远程去k8s docker里面获取信息&#xff0c;于是&#xff0c;写了一个如下的命令&#xff0c;执行完之后&#xff0c;报错了。 ssh 192.168.100.2 sudo crictl exec -it xxx.docker /usr/bin/lscpu --online --extended错误信息如下&#xff1a; time“2025-07-11T21…

使用FastAdmin框架开发二

继上一篇使用FastAdmin框架开发-CSDN博客教程 部署完项目后我们就可以边开发边调试了 在开发前我们可以先做一些基本设置 安装成功后会生成一个项目后台的地址http://域名/VrHGtzlfMB.php/index/login&#xff0c;后台入口文件是随机生成的&#xff0c;当然我们也可以根据我…