分享一款JVM執行緒堆疊線上分析工具
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JVM 執行緒堆疊分析過程詳解JVM執行緒
- Java多執行緒-程式執行堆疊分析Java執行緒
- 輕巧的執行緒堆疊檢視工具HotThreads執行緒thread
- 如何利用執行緒堆疊定位問題執行緒
- 如何抓取Thread Dump(轉儲執行緒堆疊)thread執行緒
- [JVM工具(1)] 堆疊檢查利器jstat的使用JVMJS
- 根據openGauss/MogDB的lwtid檢視執行緒堆疊執行緒
- 怎樣在程式中獲取所有執行緒的堆疊資訊?執行緒
- 深入理解JVM(③)執行緒與Java的執行緒JVM執行緒Java
- JVM中的執行緒行為JVM執行緒
- 瞭解Javascript中的執行上下文和執行堆疊JavaScript
- 解讀 JavaScript 之引擎、執行時和堆疊呼叫JavaScript
- JavaScript的工作原理:引擎,執行時和呼叫堆疊JavaScript
- JVM詳解(四)——執行時資料區-堆JVM
- JVM異常不列印堆疊資訊 [ -XX:-OmitStackTraceInFastThrow ]JVMMITAST
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- JavaScript 工作原理之一-引擎,執行時,呼叫堆疊(譯)JavaScript
- 深入分析JVM執行引擎JVM
- JVM 執行緒池發展趨勢JVM執行緒
- (8)jvm堆疊底層原理,伺服器啟動JVM伺服器
- Java 執行緒池執行原理分析Java執行緒
- JVM 進行執行緒同步背後的原理JVM執行緒
- JavaScript中的執行上下文和堆疊是什麼JavaScript
- 聊一聊JavaScript中的執行上下文和堆疊JavaScript
- [譯] JavaScript 如何工作:對引擎、執行時、呼叫堆疊的概述JavaScript
- JVM系列(七) – JVM線上監控工具JVM
- JVM系列(七) - JVM線上監控工具JVM
- 巧用Grafana和Arthas自動抓取K8S中異常Java程式的執行緒堆疊GrafanaK8SJava執行緒
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- webrtc執行緒模型分析Web執行緒模型
- RxJava 執行緒模型分析RxJava執行緒模型
- strerror執行緒安全分析Error執行緒
- JS 堆疊JS
- java堆疊Java
- 堆疊圖
- 平衡堆疊
- 深入理解JVM(③)再談執行緒安全JVM執行緒
- 從Java到JVM到OS執行緒睡眠JavaJVM執行緒