1. 程式人生 > >Java執行狀態分析2:獲取執行緒堆疊資訊

Java執行狀態分析2:獲取執行緒堆疊資訊

Java執行狀態分析2:獲取執行緒堆疊資訊

基本概念

出現記憶體洩漏或者執行緩慢場景,有時候無法直接從業務日誌看出問題時候,需要分析jvm記憶體和執行緒堆疊

執行緒堆疊資訊主要記錄jvm執行緒在某時刻執行緒執行情況,分析執行緒狀態可以跟蹤到程式出問題的地方

記憶體堆疊資訊主要記錄jvm堆中在某時刻物件使用情況,主要用於跟蹤是哪個物件佔用了太多的空間,從而跟蹤導致記憶體洩漏的地方

跟蹤執行緒資訊

檢視當前執行緒數量

actuator

1.x

http://host:port/metrics/threads //當前程序的執行緒數
http://host:port/metrics/threads.daemon  //當前程序後臺駐留執行緒數
http://host:port/metrics/threads.peak  //當前程序執行緒數峰值

2.x

http://host:port/actuator/metrics/jvm.threads.daemon  //當前程序後臺駐留執行緒數
http://host:port/actuator/metrics/jvm.threads.live  //當前程序的執行緒數
http://host:port/actuator/metrics/jvm.threads.peak  //當前程序執行緒數峰值

sop hystrix 執行緒狀態

http://host:port/sys/hystrix/threads

linux

ps huH p {pid}|wc -l

jstack生成執行緒堆疊

當服務cup飆升或者出問題需要從主機層面定位時候,使用top -c 命令檢視對應哪個程序佔用了過高資源

找到資源佔用高的程序

明確需要定位的程序通過如下命令找到對應的程序id

ps aux|grep {application alias}

接下來通過jstack匯出對應的執行緒堆疊

jstack 對應引數如下

  • -m to print both java and native frames (mixed mode)
  • -l long listing. Prints additional information about locks

可以通過如下命令定位具體高load執行緒:

查詢程序具體哪個執行緒佔用高load
top -Hp {程序pid}

thread id為十六進位制格式轉十六進位制值
printf %x {執行緒pid}

指定特定行數堆疊資訊
jstack {程序id}|grep -A 200 {執行緒id}

伺服器執行緒相對較多,檔案大小較大,一般不會考慮在伺服器看,另外這樣查也會導致忽略了一些統計資訊

通過如下命令匯出檔案,下載到本地查

jstack -l {pid} >> {dump-file-path}

如何檢視分析dump