您好,登錄后才能下訂單哦!
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】
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。