首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Linux 下使用 jstack 導出 Java 線程堆棧分析排查指南

     編輯:Java 相關知識

背景與目的

當 Java 應用出現 CPU 飆高、死鎖、響應緩慢等問題時,jstack 是最直接、無侵入的現場診斷工具。本文提供一個生產環境可用的 Shell 腳本,實現定時、批量導出指定 Java 進程的線程快照,便於事後離線分析。

核心腳本:auto_jstack.sh

#!/bin/bash
# 配置區 ---------------------------------------------------
PROCESS_NAME="java"                    # 進程關鍵字
JSTACK_PATH="/usr/java/jdk1.8.0_202/bin/jstack"  # jstack 絕對路徑
LOG_DIR="/var/log/jstack_dumps"        # 輸出目錄
# ---------------------------------------------------------

mkdir -p "$LOG_DIR"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")

# 獲取目標進程 PID 列表(排除 grep 自身)
PIDS=$(pgrep -f "$PROCESS_NAME" | grep -v $$)

if [ -z "$PIDS" ]; then
    echo "[$(date)] 未找到匹配進程: $PROCESS_NAME"
    exit 0
fi

for PID in $PIDS; do
    OUTFILE="${LOG_DIR}/jstack_${PID}_${TIMESTAMP}.log"
    echo "[$(date)] 正在導出 PID=$PID 到 $OUTFILE"
    # -l 參數:長列表模式,包含鎖信息;-F 強制模式(進程掛起時使用)
    "$JSTACK_PATH" -l "$PID" > "$OUTFILE" 2>&1
    if [ $? -eq 0 ]; then
        echo "[$(date)] 導出成功,大小: $(du -h "$OUTFILE" | cut -f1)"
    else
        echo "[$(date)] 導出失敗,請檢查權限或進程狀態"
    fi
done

關鍵參數詳解

參數作用建議
-l長列表模式,輸出 java.util.concurrent 鎖的額外信息生產排查必加
-F強制執行(進程無響應時)慎用,可能導致 JVM 暫停更久
-m混合模式,同時輸出 Native C/C++ 堆棧需排查 JNI/底層崩潰時使用

定時部署建議

# crontab -e
# 每 5 分鐘自動導出一次,保留最近 7 天
*/5 * * * * /opt/scripts/auto_jstack.sh >> /var/log/jstack_cron.log 2>&1
# 定期清理舊文件
0 3 * * * find /var/log/jstack_dumps -type f -mtime +7 -delete

線程堆棧關鍵狀態速查

狀態關鍵字典型成因
RUNNABLErunning / in native正常執行 / JNI 呼叫 / GC 線程
BLOCKEDwaiting for monitor entry同步鎖競爭、死鎖候選
WAITINGwaiting on <address>Object.wait()、Thread.join()
TIMED_WAITINGsleeping / waiting with timeoutThread.sleep()、wait(timeout)

常見問題定位套路

  1. CPU 100%:多次導出對比,找到持續 RUNNABLE 且堆棧固定的業務線程
  2. 死鎖:搜尋 BLOCKED 且互相持有對方所需鎖的線程對
  3. 線程泄漏:線程數持續增長,堆棧多為 WAITING 於同一條件隊列
  4. 長耗時請求:對比業務日誌時間戳,鎖定堆棧停留在 DB 查詢/外部 RPC 的線程

進階分析工具推薦

  • fastThread:在線上傳 jstack 文件自動生成可視化報告
  • Thread Dump Analyzer (TDA):Swing 桌面工具,支援多文件對比
  • Arthas / async-profiler:線上動態追蹤,無需重啟

總結

將 jstack 自動化導出納入常規運維體系,配合關鍵狀態識別與可視化工具,能將 Java 疑難雜癥的平均定位時間(MTTR)從小時級壓縮至分鐘級。建議在專案啟動腳本中集成此腳本,實現「開箱即用」的觀測能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved