分享一款JVM執行緒堆疊線上分析工具

tianxiaoxu發表於2018-07-23

JVM大家可能都知道是個什麼玩意-Java虛擬機器,但是到底是個什麼鬼?相信即使工作3-5年的程式設計師可能也不大瞭解。

如題所述,今天與大家分享的是如何分析JVM的執行緒堆疊以及如何從堆疊資訊中找出問題。執行緒堆疊分析儘管不是初學者一門必備的技術,但是對於自身走向高程來說應該是必備的傍身技能。

哎...記憶體又溢位了,唉...?怎麼突然CPU200%了等等一系列的問題都需要從執行緒堆疊中儲存的資訊找到問題所在。

JVM 執行緒堆疊

首先我們瞭解一下JVM 執行緒堆疊——它是什麼?

JVM執行緒堆疊是一個給定時間的快照,它能向你提供所有被建立出來的Java執行緒的完整清單.

每一個被發現的Java執行緒都會給你如下資訊:

– 執行緒的名稱;經常被中介軟體廠商用來識別執行緒的標識,一般還會帶上被分配的執行緒池名稱以及狀態 (執行,阻塞等等.)

– 執行緒型別 & 優先順序,例如 : daemon prio=3 中介軟體程式一般以後臺守護的形式建立他們的執行緒,這意味著這些執行緒是在後臺執行的;它們會向它們的使用者提供服務,例如:Java EE應用程式

– Java執行緒ID,例如 : tid=0x000000011e52a800 這是透過 java.lang.Thread.getId() 獲得的Java執行緒ID,它常常用自增長的長整形 1..n 實現

– 原生執行緒ID,例如 : nid=0x251c ,原生執行緒ID可以讓你獲得諸如從作業系統的角度來看那個執行緒在你的JVM中使用了大部分的CPU時間等這樣的相關資訊

– Java執行緒狀態和詳細資訊,例如: waiting for monitor entry [0xfffffffea5afb000] java.lang.Thread.State: BLOCKED (on object monitor)可以快速的瞭解到執行緒狀態極其當前阻塞的可能原因

– Java執行緒棧跟蹤;這是目前為止你能從執行緒堆疊中找到的最重要的資料. 這也是你花費最多分析時間的地方,因為Java棧跟蹤向提供了你將會在稍後的練習環節瞭解到的導致諸多型別的問題的根本原因,所需要的90%的資訊。

問題描述

linux系統下,線上環境Tomcat程式CPU突然飆升到200%

問題解決

查詢對應Tomcat程式號

ps -ef|grep tomcat8_itstyle

匯出堆疊資訊,查詢程式PID為8564

jstack -l 8564 >  8564.stack

下載8564.stack並打包為zip格式上傳到GCeasy,生成分析報告如下: 

吃不吃精,喜不喜歡,介面話報告分析,總有一項讓你喜歡。

擴充套件閱讀

jps命令

jps(Java Virtual Machine Process Status Tool)是JDK1.5提供的一個顯示當前所有java程式pid的命令,簡單實用,非常適合在linux/unix平臺上簡單察看當前java程式的一些簡單情況。很多人都是用過unix系統裡的ps命令,這個命令主要是用來顯示當前系統的程式情況,有哪些程式以及程式id。 jps 也是一樣,它的作用是顯示當前系統的java程式情況及程式id。我們可以透過它來檢視我們到底啟動了幾個java程式(因為每一個java程式都會獨佔一個java虛擬機器例項),並可透過opt來檢視這些程式的詳細啟動引數。

命令格式:jps [options ] [ hostid ]

[options]選項 : -q:只顯示pid,不顯示class名稱,jar檔名和傳遞給main 方法的引數 -m:輸出main method的引數 -l:輸出完全的包名,應用主類名,jar的完全路徑名 -v:輸出jvm引數

jstack命令

命令格式: jstack [ option ] pid jstack [ option ] executable core jstack [ option ] [server-id@]remote-hostname-or-IP

常用引數說明

1)options:

executable Java executable from which the core dump was produced.(可能是產生core dump的java可執行程式)

core 將被列印資訊的core dump檔案

remote-hostname-or-IP 遠端debug服務的主機名或ip

server-id 唯一id,假如一臺主機上多個遠端debug服務

2)基本引數:

-F當’jstack [-l] pid’沒有相應的時候強制列印棧資訊

-l長列表. 列印關於鎖的附加資訊,例如屬於java.util.concurrent的ownable synchronizers列表.

-m列印java和native c/c++框架的所有棧資訊.

-h | -help列印幫助資訊

pid 需要被列印配置資訊的java程式id,可以用jps查詢。

【本文轉自爪哇筆記 作者:小柒2012 原文連結:https://mp.weixin.qq.com/s/LdoOk8zQXVn7IHB6WI0EiQ】

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31137683/viewspace-2158362/,如需轉載,請註明出處,否則將追究法律責任。

相關文章