jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等。 線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作什麼事情,或者等待什麼資源。 若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。java
jstack命令的語法格式: jstack <pid>。能夠用jps查看java進程id。這裏要注意的是:數據庫
1. 不一樣的 JAVA虛機的線程 DUMP的建立方法和文件格式是不同的,不一樣的 JVM版本, dump信息也有差異。服務器
2. 在實際運行中,每每一次 dump的信息,還不足以確認問題。建議產生三次 dump信息,若是每次 dump都指向同一個問題,咱們才肯定問題的典型性。網絡
死鎖, Deadlock(重點關注) 工具
執行中,Runnable 性能
等待資源, Waiting on condition(重點關注) spa
等待獲取監視器, Waiting on monitor entry(重點關注)操作系統
暫停,Suspended線程
對象等待中,Object.wait() 或 TIMED_WAITING日誌
阻塞, Blocked(重點關注)
中止,Parked
Deadlock:死鎖線程,通常指多個線程調用間,進入相互資源佔用,致使一直等待沒法釋放的狀況。
Runnable:通常指該線程正在執行狀態中,該線程佔用了資源,正在處理某個請求,有可能正在傳遞SQL到數據庫執行,有可能在對某個文件操做,有可能進行數據類型等轉換。
Waiting on condition:該狀態出如今線程等待某個條件的發生。具體是什麼緣由,能夠結合 stacktrace來分析。最多見的狀況是線程在等待網絡的讀寫,好比當網絡數據沒有準備好讀時,線程處於這種等待狀態,而一旦有數據準備好讀以後,線程會從新激活,讀取並處理數據。在 Java引入 NewIO以前,對於每一個網絡鏈接,都有一個對應的線程來處理網絡的讀寫操做,即便沒有可讀寫的數據,線程仍然阻塞在讀寫操做上,這樣有可能形成資源浪費,並且給操做系統的線程調度也帶來壓力。在 NewIO裏採用了新的機制,編寫的服務器程序的性能和可擴展性都獲得提升。
若是發現有大量的線程都在處在 Wait on condition,從線程 stack看, 正等待網絡讀寫,這多是一個網絡瓶頸的徵兆。由於網絡阻塞致使線程沒法執行。一種狀況是網絡很是忙,幾 乎消耗了全部的帶寬,仍然有大量數據等待網絡讀 寫;另外一種狀況也多是網絡空閒,但因爲路由等問題,致使包沒法正常的到達。因此要結合系統的一些性能觀察工具來綜合分析,好比 netstat統計單位時間的發送包的數目,若是很明顯超過了所在網絡帶寬的限制 ; 觀察 cpu的利用率,若是系統態的 CPU時間,相對於用戶態的 CPU時間比例較高;若是程序運行在 Solaris 10平臺上,能夠用 dtrace工具看系統調用的狀況,若是觀察到 read/write的系統調用的次數或者運行時間遙遙領先;這些都指向因爲網絡帶寬所限致使的網絡瓶頸。另一種出現 Wait on condition的常見狀況是該線程在 sleep,等待 sleep的時間到了時候,將被喚醒。
locked:線程阻塞,是指當前線程執行過程當中,所須要的資源長時間等待卻一直未能獲取到,被容器的線程管理器標識爲阻塞狀態,能夠理解爲等待資源超時的線程。
Waiting for monitor entry 和 in Object.wait():Monitor是 Java中用以實現線程之間的互斥與協做的主要手段,它能夠當作是對象或者 Class的鎖。每個對象都有,也僅有一個 monitor。