java怎么找bug?Arthas原理與實戰指南

Arthas原理與實戰指南

1. Arthas簡介

Arthas是阿里巴巴開源的Java診斷工具,其名字取自《魔獸世界》的人物阿爾薩斯。它面向線上問題定位,被廣泛應用于性能分析、定位問題、安全審計等場景。Arthas的核心價值在于它能夠在不修改應用代碼、不重啟Java進程的情況下,實時動態地監控和分析運行中的Java程序。

Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的Tab自動補全功能。

2. 核心原理深度解析

2.1 Java Agent技術

Arthas基于Java Agent技術,Java Agent是JDK 1.5引入的一種能夠在不修改Java源代碼的情況下,動態修改Java字節碼的技術。

Java Agent通過以下兩種方式工作:

  • 靜態加載:通過JVM啟動參數-javaagent指定
  • 動態加載:通過Attach API動態附加到運行中的JVM

Arthas采用了動態加載的方式,使其能夠在Java應用運行過程中被加載。

Arthas工作原理
Java Agent
Instrumentation API
premain方法/agentmain方法
類字節碼轉換
JVM Attach機制
VirtualMachine.attach
loadAgent方法
字節碼操作
ASM庫
動態代理
命令處理框架
命令解析
命令執行
結果輸出

2.2 Instrumentation API

Java的java.lang.instrument包提供了一套API,允許Java Agent程序修改已加載的類的字節碼。Arthas利用這一API來實現類和方法的監控和分析。

關鍵接口和類:

  • Instrumentation:提供注冊類文件轉換器、獲取所有已加載類等功能
  • ClassFileTransformer:類文件轉換器,用于修改類的字節碼
  • Agent:Agent程序的入口點,通過premainagentmain方法啟動

2.3 JVM Attach機制

Attach機制允許一個JVM進程連接到另一個JVM進程,實現進程間通信。Arthas使用該機制動態加載Agent到目標JVM中。

核心實現在com.sun.tools.attach包中,關鍵類有:

  • VirtualMachine:代表一個JVM進程
  • VirtualMachineDescriptor:JVM進程的描述信息

2.4 ASM字節碼操作

Arthas使用ASM庫操作Java字節碼,通過修改字節碼來實現方法攔截、監控等功能。ASM是一個輕量級的字節碼操作框架,能夠動態生成和修改Java字節碼。

字節碼轉換過程:

  1. 讀取原始類字節碼
  2. 使用ASM分析字節碼結構
  3. 修改字節碼(如添加方法入口/出口的監控代碼)
  4. 返回修改后的字節碼

2.5 命令處理引擎

Arthas采用命令行交互方式,內部實現了一套完整的命令處理引擎:

  • 命令解析:將用戶輸入解析為命令對象
  • 命令執行:根據命令執行相應操作
  • 結果渲染:將執行結果格式化輸出

3. 安裝與啟動詳解

3.1 安裝方式

方式一:使用arthas-boot(推薦)

# 下載啟動腳本
curl -O https://arthas.aliyun.com/arthas-boot.jar# 啟動
java -jar arthas-boot.jar

方式二:使用全量包

# 下載全量包
curl -O https://arthas.aliyun.com/arthas-packaging.jar# 解壓
java -jar arthas-packaging.jar# 啟動
cd arthas
./arthas.sh

方式三:使用as.sh

# 下載并安裝
curl -L https://arthas.aliyun.com/install.sh | sh# 啟動
./as.sh

3.2 啟動選項詳解

啟動Arthas時,可以指定多種參數:

# 指定目標Java進程
java -jar arthas-boot.jar [PID]# 指定目標進程名稱的關鍵字
java -jar arthas-boot.jar --select JAVA_HOME# 啟動時禁用某些命令
java -jar arthas-boot.jar --exclude-commands=jvm,thread# 指定端口號
java -jar arthas-boot.jar --telnet-port 9998 --http-port 9999# 以批處理模式執行命令
java -jar arthas-boot.jar --command "thread" -c "thread" > output.txt

3.3 連接方式

Arthas提供多種連接方式:

  1. 本地命令行模式
    直接在啟動終端操作

  2. Telnet連接

    telnet 127.0.0.1 3658
    
  3. WebSocket連接
    通過瀏覽器訪問http://127.0.0.1:8563/

  4. HTTP API

    curl http://127.0.0.1:8563/api
    

4. 核心功能與命令詳解

4.1 JVM相關命令

dashboard - 系統實時數據面板

提供系統整體情況的實時數據,包括線程、內存、GC、運行環境等信息。

# 每5秒刷新一次
dashboard -i 5000# 只顯示前10個線程
dashboard -n 10

輸出示例:

ID     NAME                   GROUP                  PRIORITY  STATE    %CPU     DELTA_TIME TIME     INTERRUPTED DAEMON
17     pool-2-thread-1        main                   5         RUNNABLE 27       0.136      0:0.203  false       false
21     pool-2-thread-5        main                   5         RUNNABLE 26       0.132      0:0.096  false       false
22     pool-2-thread-6        main                   5         RUNNABLE 26       0.132      0:0.097  false       false
......Memory                    used    total    max      usage    GC
heap                      32M     155M     1820M    1.76%    gc.ps_scavenge.count              118
ps_eden_space             14M     65M      672M     2.21%    gc.ps_scavenge.time(ms)           1890
ps_survivor_space         4M      5M       5M       81.92%   gc.ps_marksweep.count             5
ps_old_gen                12M     85M      1365M    0.91%    gc.ps_marksweep.time(ms)          1140
jvm - JVM信息
# 顯示JVM信息
jvm# 同時顯示ClassLoader信息
jvm -c

輸出包含:

  • Java運行時版本與廠商
  • JVM參數
  • 類加載統計
  • JVM內存區域使用情況
  • 垃圾收集器信息
  • 操作系統和硬件信息
thread - 線程分析
# 顯示所有線程
thread# 查看指定線程的棧信息
thread 1# 查看最忙的前3個線程棧
thread -n 3# 查看阻塞其他線程的線程
thread -b# 查找指定狀態的線程
thread --state BLOCKED# 線程池信息
thread -i

線程池參數解析:

- corePoolSize: 核心線程數
- maximumPoolSize: 最大線程數
- keepAliveTime: 線程存活時間
- queueCapacity: 隊列容量
- taskCount: 已執行和未執行的任務總數
- completedTaskCount: 已完成的任務數
- largestPoolSize: 歷史最大線程數
- poolSize: 當前線程數
- activeCount: 當前活動線程數
sysprop - 系統屬性
# 查看所有系統屬性
sysprop# 查看指定屬性
sysprop java.version# 設置系統屬性
sysprop user.country US
heapdump - 堆轉儲
# 生成堆轉儲文件到指定路徑
heapdump /tmp/dump.hprof# 只轉儲活著的對象
heapdump --live /tmp/dump.hprof

4.2 類相關命令

sc - 查找類
# 模糊查找類
sc *List*# 查找指定類的詳細信息
sc -d java.util.ArrayList# 查找類的方法信息
sc -d -f java.util.ArrayList# 顯示類加載器信息
sc -c -d java.util.ArrayList# 指定類加載器查找
sc -c classLoaderHash *MathGame*
sm - 查找方法
# 查找類的所有方法
sm java.util.ArrayList# 查找方法的詳細信息
sm -d java.util.ArrayList add# 正則匹配方法
sm java.util.ArrayList "add|remove"
jad - 反編譯
# 反編譯指定類
jad com.example.demo.arthas.user.UserController# 指定反編譯結果輸出路徑
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java# 只反編譯指定的方法
jad com.example.demo.arthas.user.UserController getUserById
mc - 內存編譯
# 編譯指定Java文件
mc /tmp/UserController.java# 指定輸出目錄
mc -d /tmp/output /tmp/UserController.java# 指定ClassLoader編譯
mc -c 5a54a66 /tmp/UserController.java
redefine - 熱加載
# 重新加載類
redefine /tmp/output/com/example/demo/arthas/user/UserController.class# 指定ClassLoader
redefine -c 5a54a66 /tmp/output/com/example/demo/arthas/user/UserController.class# 批量重新加載
redefine -p /tmp/output/

4.3 方法相關命令

monitor - 方法監控
# 監控方法執行情況
monitor -c 5 com.example.demo.arthas.user.UserController * # 匹配正則表達式方法 
monitor -c 5 com.example.demo.arthas.user.UserController get*# 監控異常統計
monitor -e -c 5 com.example.demo.arthas.user.UserController *# 監控匹配的構造函數
monitor -c 5 com.example.demo.arthas.user.UserController <init>

監控指標說明:

- timestamp: 時間戳
- class: 類名
- method: 方法名
- total: 調用次數
- success: 成功次數
- fail: 失敗次數
- rt: 平均響應時間(ms)
- fail-rate: 失敗率
watch - 方法觀察
# 觀察方法的入參和返回值
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj}' -x 3# 觀察異常信息
watch com.example.demo.arthas.user.UserController getUserById '{params, throwExp}' -e -x 2# 觀察入參和返回值,并按照條件過濾
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj}' 'params[0] > 100' -x 3# 觀察入參和返回值,限制次數
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj}' '#cost > 10' -n 3# 按表達式過濾,只有耗時大于10ms的才會輸出
watch com.example.demo.arthas.user.UserController getUserById '{params, returnObj, #cost}' '#cost > 10' -n 3 -x 3

watch支持的表達式工具類:

  • params:參數列表
  • returnObj:返回值
  • throwExp:拋出的異常
  • target:當前對象實例
  • clazz:當前類
  • method:當前方法
  • #cost:執行耗時
trace - 方法調用鏈分析
# 跟蹤方法執行的調用鏈
trace com.example.demo.arthas.user.UserController getUserById# 指定最大展開層級
trace -j 2 com.example.demo.arthas.user.UserController getUserById# 按調用耗時過濾
trace com.example.demo.arthas.user.UserController getUserById '#cost > 10'# 只跟蹤本地方法
trace --skipJDKMethod false com.example.demo.arthas.user.UserController getUserById

輸出示例:

`---ts=2018-12-04 18:11:45;thread_name=http-nio-8080-exec-5;id=31;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@6bc168e5`---[10.127743ms] com.example.demo.arthas.user.UserController:getUserById()+---[0.060919ms] com.example.demo.arthas.user.UserController:getUserById:before()`---[9.732368ms] com.example.demo.arthas.user.UserRepository:findById()`---[9.499895ms] org.hibernate.jpa.internal.EntityManagerImpl:find()`---[9.187044ms] org.hibernate.jpa.internal.EntityManagerImpl:find()
stack - 調用棧跟蹤
# 查看調用來源
stack com.example.demo.arthas.user.UserController getUserById# 條件表達式過濾
stack com.example.demo.arthas.user.UserRepository findById 'params[0]==1'# 指定采樣次數
stack -n 5 com.example.demo.arthas.user.UserController getUserById
tt - 方法執行時空隧道

tt命令記錄方法執行的詳細信息,支持回放。

# 記錄方法執行過程
tt -t com.example.demo.arthas.user.UserController getUserById# 查看記錄的調用信息
tt -l# 查看記錄的詳細信息
tt -i 1000# 重新執行一次調用
tt -i 1000 -p# 指定方法入參重新執行
tt -i 1000 -p '{params[0] = 2}'# 條件過濾
tt -t com.example.demo.arthas.user.UserController getUserById 'params[0]==1'

4.4 增強功能

profiler - 性能剖析
# 查看profiler支持的事件
profiler list# 開始采樣,按CPU采樣
profiler start# 指定采樣事件
profiler start --event alloc# 指定文件輸出格式(支持svg、html、jfr等)
profiler start --format html# 采樣一段時間后停止
profiler stop# 將結果保存到指定文件
profiler stop --file /tmp/result.html# 支持火焰圖
profiler start --event cpu --format svg
profiler stop --file /tmp/cpu.svg
vmtool - JVM工具
# 獲取對象
vmtool --action getInstances --className java.lang.String --limit 10# 查看對象信息
vmtool --action getInstances --className com.example.demo.arthas.user.User --express 'instances[0].username'# 強制GC
vmtool --action forceGc
ognl - 執行OGNL表達式
# 獲取靜態字段
ognl '@com.example.demo.arthas.user.UserService@INSTANCE'# 調用靜態方法
ognl '@java.lang.System@currentTimeMillis()'# 獲取變量值
ognl '#user=@com.example.demo.arthas.user.UserController@userService.findById(1), #user.username'# 調用對象方法
ognl '#user=@com.example.demo.arthas.user.UserController@userService.findById(1), #user.setUsername("arthas"), #user'

5. 實戰案例詳解

5.1 CPU使用率過高問題分析

當應用CPU使用率異常升高時,使用Arthas可以快速定位問題:

用戶 Arthas JVM 1. 執行dashboard命令觀察系統情況 獲取線程和CPU信息 返回高CPU線程信息 2. 執行thread -n 3命令查看最繁忙線程 獲取繁忙線程棧 返回線程棧信息 3. 執行thread [threadId]查看具體線程棧 獲取指定線程詳細信息 返回線程詳細信息 4. 執行trace命令跟蹤熱點方法 開始方法調用鏈跟蹤 返回方法調用耗時 5. 執行profiler命令進行性能剖析 開始CPU采樣 返回CPU采樣結果 用戶 Arthas JVM

實戰步驟

  1. 首先執行dashboard查看系統整體情況:

    dashboard -n 10
    
  2. 發現有線程CPU使用率很高,執行thread命令查看線程狀態:

    # 查看占用CPU最高的3個線程
    thread -n 3
    
  3. 定位到問題線程,查看其棧信息:

    thread 16234
    
  4. 發現可疑方法,使用trace跟蹤執行鏈路:

    trace com.example.service.OrderService calculatePrice '#cost > 200'
    
  5. 使用profiler進行火焰圖分析:

    profiler start --event cpu
    # 等待30秒
    profiler stop --format svg --file /tmp/cpu.svg
    

5.2 內存泄漏分析

持續上升
偶發暴漲
內存泄漏問題
觀察JVM內存趨勢
使用dashboard命令
使用heapdump導出堆內存
使用MAT分析堆轉儲文件
使用watch觀察可疑方法
使用vmtool查看對象實例
定位問題對象

實戰步驟

  1. 首先執行dashboardmemory觀察內存使用情況:

    # 觀察內存趨勢
    dashboard -i 5000# 查看詳細內存信息
    memory
    
  2. 發現Old區內存持續增長,使用heapdump導出堆內存:

    heapdump --live /tmp/heap.hprof
    
  3. 使用MAT分析堆轉儲文件(離線分析)

  4. 根據MAT分析結果,定位到可疑類,使用vmtool查看實例:

    vmtool --action getInstances --className com.example.cache.UserCache --limit 10
    
  5. 使用ognl查看對象詳情:

    ognl '#cache=@com.example.cache.UserCache@INSTANCE, #cache.cacheMap.size()'
    
  6. 使用watch監控可疑方法:

    watch com.example.cache.UserCache put '{params, target.cacheMap.size()}' -x 3
    

5.3 線上修復Bug

發現線上Bug
使用jad反編譯
修改代碼
使用mc編譯
使用redefine熱加載
驗證問題是否修復

實戰步驟

  1. 首先定位到問題代碼,使用jad反編譯:

    jad --source-only com.example.service.OrderService > /tmp/OrderService.java
    
  2. 修改源代碼,修復Bug:

    vim /tmp/OrderService.java
    
  3. 使用mc編譯修改后的代碼:

    mc -d /tmp/classes /tmp/OrderService.java
    
  4. 使用redefine熱加載修改后的類:

    redefine /tmp/classes/com/example/service/OrderService.class
    
  5. 使用watch驗證修復效果:

    watch com.example.service.OrderService calculatePrice '{params, returnObj}' -x 3
    

5.4 定位接口超時問題

用戶 Arthas JVM 執行trace命令跟蹤接口調用鏈 開始調用鏈跟蹤 返回方法調用耗時 找到耗時長的方法,使用stack查看調用來源 獲取方法調用棧 返回調用棧信息 使用watch命令觀察方法執行 監控方法執行 返回方法入參和執行結果 使用tt命令記錄執行歷史 記錄方法調用 保存調用記錄 用戶 Arthas JVM

實戰步驟

  1. 首先用trace跟蹤超時接口:

    trace com.example.controller.ApiController handleRequest '#cost > 1000'
    
  2. 發現有方法特別耗時,使用stack查看其調用來源:

    stack com.example.service.RemoteService requestData
    
  3. 使用watch觀察方法的入參和返回值:

    watch com.example.service.RemoteService requestData '{params, returnObj, #cost}' -x 3
    
  4. 使用tt記錄多次調用,分析變化趨勢:

    tt -t com.example.service.RemoteService requestData
    
  5. 回放某次執行,調試分析:

    tt -i 1000 -p
    

6. 高級應用場景

6.1 Spring Boot應用診斷

診斷Spring應用的常用命令組合:

# 查找所有Controller
sc -d *Controller# 查看一個Bean的詳細信息
ognl '#context=@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(#request.getServletContext()), #context.getBean("userService")'# 查找所有RequestMapping
ognl '#springContext=@org.springframework.web.context.ContextLoader@getCurrentWebApplicationContext(), #springContext.getBean("requestMappingHandlerMapping").getHandlerMethods().entrySet()' -x 2

6.2 動態日志調整

運行時調整日志級別是Arthas的強大功能:

# 查看logger信息
logger# 查看指定logger信息
logger -n org.springframework.web# 修改日志級別
logger --name org.springframework.web --level debug# 在方法調用時臨時調高日志級別
watch com.example.service.UserService update '{params, returnObj}' -x 3 '#cost>100' 'logger:org.springframework.web:TRACE'

6.3 性能優化

對應用進行性能優化的常用方法:

# 查找熱點類和方法
profiler start --event cpu
profiler stop --format html --file /tmp/cpu-profiler.html# 用watch命令觀察方法執行次數與耗時
monitor -c 5 com.example.service.* *# 對比優化前后性能變化
tt -t com.example.service.OrderService calculatePrice
# 優化后
tt -t com.example.service.OrderService calculatePrice
tt -l

6.4 多應用實例問題

當有多個同類型應用實例時,如何診斷問題:

# 啟動時選擇特定實例
java -jar arthas-boot.jar --select "demo-app"# 設置唯一tunnel id
java -jar arthas-boot.jar --tunnel-server "ws://tunnel-server:7777/ws" --agent-id "app1_instance1"# 使用Web Console連接特定實例
http://tunnel-server:8080/arthas-web-console/index.html?agentId=app1_instance1

7. 最佳實踐與注意事項

7.1 性能影響控制

Arthas雖然強大,但使用不當會影響線上系統性能:

  1. 避免長時間使用trace/watch等命令

    # 限制采樣次數
    trace -n 10 com.example.service.OrderService calculatePrice# 限制命令執行時間
    trace --duration 30 com.example.service.OrderService calculatePrice
    
  2. 使用條件表達式過濾

    # 只監控耗時超過100ms的調用
    trace com.example.service.OrderService calculatePrice '#cost > 100'
    
  3. 合理設置采樣間隔

    # 增加采樣間隔,降低對系統的影響
    monitor -c 10 -i 5000 com.example.service.OrderService calculatePrice
    

7.2 安全措施

生產環境使用Arthas需注意以下安全事項:

  1. 設置訪問認證

    java -jar arthas-boot.jar --username admin --password admin
    
  2. 使用tunnel server模式保證網絡安全

    java -jar arthas-boot.jar --tunnel-server 'ws://tunnel-server:7777/ws'
    
  3. 限制命令使用

    java -jar arthas-boot.jar --exclude-commands=jad,mc,redefine
    
  4. 及時退出Arthas會話

    # 使用完后退出
    quit# 完全退出,卸載Agent
    stop
    

7.3 版本兼容性

Arthas的不同版本可能有命令差異,建議:

  1. 總是使用與JDK版本兼容的Arthas版本
  2. 定期更新Arthas到最新版本以獲取bug修復和新功能
  3. 在測試環境驗證Arthas命令后再在生產環境使用

7.4 與其他工具配合使用

Arthas可以與其他工具結合使用,形成完整的問題診斷體系:

  1. 與MAT配合分析內存問題
  2. 與JMC/JFR結合進行性能分析
  3. 與ELK結合進行日志分析
  4. 與APM工具結合進行全鏈路追蹤

8. 總結

Arthas作為一款強大的Java診斷工具,通過Java Agent技術實現了對JVM運行時的深度觀測和操控能力。它的優勢在于:

  1. 無侵入性:不需要修改應用代碼或重啟應用
  2. 實時分析:能夠動態獲取運行時數據
  3. 功能豐富:從線程分析到字節碼操作,覆蓋了診斷需求
  4. 易于使用:命令行界面簡單直觀

掌握Arthas使你在面對復雜的Java生產環境問題時,能夠像手術刀一樣精準定位并解決問題,真正做到知其所以然。

在實際應用中,建議通過大量實踐熟悉各個命令的使用場景和優缺點,形成自己的問題診斷方法論。通過不斷實踐,你會發現Arthas不僅是一個工具,更是一種解決問題的思路和方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77614.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python自學第1天:變量,打印,類型轉化

突然想學Python了。經過Deepseek的推薦&#xff0c;下載了一個Python3.12安裝。安裝過程請自行搜索。 乖乖從最基礎的學起來&#xff0c;廢話不說了&#xff0c;上鏈接&#xff0c;呃&#xff0c;打錯了&#xff0c;上知識點。 變量的定義 # 定義一個整數類型的變量 age 10#…

基于STM32中斷講解

基于STM32中斷講解 一、NVIC講解 簡介&#xff1a;當一個中斷請求到達時&#xff0c;NVIC會確定其優先級并決定是否應該中斷當前執行的程序&#xff0c;以便及時響應和處理該中斷請求。這種設計有助于提高系統的響應速度和可靠性&#xff0c;特別是在需要處理大量中斷請求的實…

游戲盾和高防ip有什么區別

游戲盾和高防IP都是針對網絡攻擊的防護方案&#xff0c;但??核心目標、技術側重點和應用場景存在顯著差異??。以下是兩者的詳細對比分析&#xff1a; ??一、核心定位與目標?? ??維度????高防IP????游戲盾????核心目標??抵御大流量網絡攻擊&#xff08…

Spark-SQL3

Spark-SQL 一.Spark-SQL核心編程&#xff08;四&#xff09; 1.數據加載與保存&#xff1a; 1&#xff09;通用方式&#xff1a; SparkSQL 提供了通用的保存數據和數據加載的方式。這里的通用指的是使用相同的API&#xff0c;根據不同的參數讀取和保存不同格式的數據&#…

DeepSeek與Napkin:信息可視化領域的創新利器

摘要 在數字化信息爆炸的時代&#xff0c;如何高效地組織思路并將其轉化為直觀、清晰的可視化圖表&#xff0c;成為眾多領域面臨的關鍵問題。本文深入剖析了DeepSeek與Napkin這兩款工具&#xff0c;詳細探討它們在信息處理與可視化過程中的功能特性、協同工作機制、應用場景、…

conda 創建、激活、退出、刪除環境命令

參考博客&#xff1a;Anaconda創建環境、刪除環境、激活環境、退出環境 使用起來覺得有些不方便可以改進&#xff0c;故寫此文。 1. 創建環境 使用 -y 跳過確認 conda create -n 你的環境名 -y 也可以直接選擇特定版本 python 安裝&#xff0c;以 3.10 為例&#xff1a; co…

嵌入式芯片中的 低功耗模式 內容細講

電源域與運行級別概述 電源域&#xff08;Power Domain&#xff09; 核心域&#xff08;Core Domain&#xff09;&#xff1a;包括 CPU 核心和關鍵架構模塊&#xff08;如 NVIC、CPU 內核寄存器&#xff09;。 外設域&#xff08;Peripheral Domain&#xff09;&#xff1a;…

Java中常見的鎖synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock

在Java中&#xff0c;鎖是實現多線程同步的核心機制。不同的鎖適用于不同的場景&#xff0c;理解其實現原理和使用方法對優化性能和避免并發問題至關重要。 一、隱式鎖&#xff1a;synchronized 關鍵字 實現原理 基于對象監視器&#xff08;Monitor&#xff09;&#xff1a;每…

@JsonView + 單一 DTO:如何實現多場景 JSON 字段動態渲染

JsonView 單一 DTO&#xff1a;如何實現多場景 JSON 字段動態渲染 JsonView 單一 DTO&#xff1a;如何實現多場景 JSON 字段動態渲染1、JsonView 注解產生的背景2、為了滿足不同場景下返回對應的屬性的做法有哪些&#xff1f;2.1 最快速的實現則是針對不同場景新建不同的 DTO…

Etcd 壓縮整理

etcd數據存儲 在實際生產中使用 ETCD 存儲元數據&#xff0c;起初集群規模不大的時候元數據信息不多沒有發現什么問題。隨著集群規模越來越大&#xff0c;可能引發存儲問題。 —auto-compaction-retention 由于ETCD數據存儲多版本數據&#xff0c;隨著寫入的主鍵增加歷史版本需…

【更新完畢】2025媽媽杯C題 mathercup數學建模挑戰賽C題數學建模思路代碼文章教學:音頻文件的高質量讀寫與去噪優化

完整內容請看文章最下面的推廣群 我將先給出文章、代碼、結果的完整展示, 再給出四個問題詳細的模型 面向音頻質量優化與存儲效率提升的自適應編碼與去噪模型研究 摘 要 隨著數字媒體技術的迅速發展&#xff0c;音頻處理技術在信息時代的應用愈加廣泛&#xff0c;特別是在存儲…

React-請勿在循環或者條件語句中使用hooks

這是React Hooks的首要規則&#xff0c;這是因為React Hooks 是以單向循環鏈表的形式存儲&#xff0c;即是有序的。循環是為了從最后一個節點移到一個節點的時候&#xff0c;只需通過next一步就可以拿到第一個節點&#xff0c;而不需要一層層回溯。React Hooks的執行&#xff0…

【大模型】 LangChain框架 -LangChain實現問答系統

LangChain 介紹與使用方法 1. 什么是 LangChain&#xff1f;2. LangChain 的主要功能3. 如何使用 LangChain&#xff1f;3.1 環境準備3.2 基本使用示例3.2.1 簡單的問答系統3.2.2 結合外部工具 3.3 高級用法 4. 常見問題及解決方法4.1 安裝問題4.2 運行問題4.3 性能問題 5. 實戰…

企業級HAProxy高可用離線部署實戰(附Kubernetes APIServer負載均衡配置)

企業級HAProxy高可用離線部署實戰&#xff08;附Kubernetes APIServer負載均衡配置&#xff09; 摘要&#xff1a;本文深入講解在離線環境下部署HAProxy 3.1.1的全流程&#xff0c;涵蓋源碼編譯、系統服務封裝、K8S APIServer四層負載配置等核心環節&#xff0c;并提供生產級高…

Python網絡爬蟲設計(一)

目錄 一、網絡爬蟲 1、基本的爬蟲 2、獲取URL 3、查找網頁源碼關鍵字 4、代碼實現 二、requests庫 1、requests的優勢和劣勢 2、獲取網頁的其他庫 &#xff08;1&#xff09;selenium庫 &#xff08;2&#xff09;pyppeteer庫 三、pyppeteer庫 1、pyppeteer庫的來歷…

BR_頻譜20dB 帶寬(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])

目錄 一、規范要求 1、協議章節 2、測試目的 二、測試方法 1、樣機初值條件&#xff1a; 2、測試步驟: 方法一&#xff1a;頻譜儀 方法二&#xff1a;綜測儀CMW500 3、預期結果 一、規范要求 1、協議章節 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…

【橘子大模型】初探rag知識庫的構建

一、簡介 我們在實現了一系列功能之后&#xff0c;終于來到了rag的部分&#xff0c;下面我們將基于langchain來實現一個rag檢索。 關于rag方面的知識&#xff0c;可以查看這兩篇文章&#xff1a; 大模型應用之RAG詳解 什么是 RAG&#xff08;檢索增強生成&#xff09; 或者是去…

CentOS7執行yum命令報錯 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7執行yum命令報錯 引更新yum源備份原有源創建新的源文件清理并重建緩存 引 CentOS 7 系統無法連接到 CentOS 的官方鏡像站點。這通常是由于網絡問題或 CentOS 7 已停止維護導致的&#xff08;2024年6月30日后 CentOS 7 已進入 EOL&#xff09; 報錯明細&#xff1a; 已…

VSCode安裝與環境配置(Mac環境)

20250419 - 概述 大概是非常久之前了&#xff0c;裝了VSCode&#xff0c;估計都得21的時候了&#xff0c;電腦上也沒更新過。當時安裝也直接裝上就完事了。這次把版本更新一下&#xff0c;同時記錄一下這個安裝過程。 安裝 mac下安裝非常簡單&#xff0c;直接從官網下載&am…

QML動畫--ParallelAnimation和SequentialAnimation

一、ParallelAnimation ParallelAnimation 是 QML 中用于并行執行多個動畫的容器動畫類型&#xff0c;可以同時運行多個子動畫。 基本用法 qml import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnim…