首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Servlet 專案 CPU 飆高排查:top + jstack 定位熱點執行緒、鎖爭用與資料庫連線洩漏實戰

     編輯:程式設計綜合問答

現象

  • 單核 CPU 佔用 300%+ (多執行緒並發)。
  • top -H -p 顯示大量 catalina-exec-* 執行緒各佔 0.7%-2.5% CPU。
  • jstack 抓取堆疊多為 TIMED_WAITING (sleeping/parking) 或 RUNNABLE (SocketInputStream.read)。

關鍵堆疊分析

排查行動清單

  1. 移除硬編碼 sleep:IWanbuService.doGet:74 的 Thread.sleep(2) 應改為非阻塞異步或事件驅動。
  2. 優化資料庫層:
    • 開啟慢查詢日誌 (long_query_time=1) 分析 SQL。
    • 檢查 C3P0 連線池大小 (maxPoolSize) 是否過大導致資料庫並發壓力。
    • Hibernate setAutoCommit 頻繁切換 → 改用交易邊界管理。
  3. 調整 Tomcat 執行緒池:server.xml 避免過多空閒執行緒佔用 CPU。
  4. 啟用 JMX / Arthas 線上診斷:arthas -c → thread -n 10 即時看熱點執行緒、trace 方法耗時。
  5. 檢查鎖爭用:jstack -l 找 locked
    重複地址,分析同步塊粒度。

工具鏈推薦

  • Arthas (阿里開源):無需重啟、線上熱追蹤、OGNL 表達式查詢物件狀態。
  • Async Profiler:低開銷 CPU/記憶體分析、火焰圖生成。
  • Prometheus + Grafana:持續監控 JVM 指標 (執行緒數、GC、HTTP 延遲)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
狀態典型堆疊可能原因
TIMED_WAITING (sleeping)Thread.sleep(2) 在 IWanbuService.doGet:74業務邏輯硬編碼睡眠、輪詢間隔過短
TIMED_WAITING (parking)LockSupport.parkNanos → LinkedBlockingQueue.pollTomcat 執行緒池空閒等待任務,**正常**,但數量過多暗示配置過大
RUNNABLE (SocketRead)MysqlIO.readFully → ConnectionImpl.setAutoCommit → C3P0 → Hibernate**資料庫查詢阻塞**,連線池耗盡、慢查詢、鎖等待