【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
英文地址,請注明出處:http://en.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;當然我們也可以根據我…