你的程序出現(xiàn)了bug?這幾款JVM工具也許可以幫你排查
在平時的開發(fā)當(dāng)中我們總是會遇到各種各樣的問題,比如說內(nèi)存泄漏、死鎖、CPU等。遇到問題不可怕,關(guān)鍵是我們?nèi)绾稳ヅ挪檫@些錯誤,對癥下藥才是根本。不過對于很多人來說,往往找不到這些問題的根本所在,因此這篇文章主要是讓我們掌握一些工具來分析到底是哪里出現(xiàn)了問題。
在之前的文章中,主要是分析了JVM的內(nèi)存結(jié)構(gòu)、類加載機(jī)制和垃圾回收機(jī)制。文章的順序也是循序漸進(jìn)的,從這篇文章當(dāng)中我們主要是分析JDK自帶的工具,把理論應(yīng)用于實(shí)踐。
首先我們先對幾種要講的工具進(jìn)行一個概述,然后再分別分析:
首先我們先對幾種要講的工具進(jìn)行一個概述,然后再分別分析:
一、性能監(jiān)控工具概述
工具主要是為了解決問題而生的,就是由于我們的程序存在著一些性能問題,才有了這些工具。其實(shí)當(dāng)我們在下載完成JDK之后,那些工具就被SUN公司隨之送給我們了。
我們可以在我們的JDK安裝目錄,下看看會有很多這樣的工具。
我們會發(fā)現(xiàn)很多這樣的exe文件,這里面有很多都是性能監(jiān)控工具。我們就抽出來幾個進(jìn)行講解。
工具名稱 | 主要作用 |
---|---|
jps(JVM Process Status Tool) | 顯示指定系統(tǒng)中所有的HotSpot虛擬機(jī)進(jìn)程 |
jstat(JVM Statistics Monitoring Tool) | 收集HotSpot虛擬機(jī)各方面的運(yùn)行數(shù)據(jù) |
jinfo(Configuration Info for Java) | 顯示虛擬機(jī)配置信息 |
jmap(Memory Map for Java) | 生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲快照(heapdump文件) |
jhat(JVM Heap Dump Browser) | 分析內(nèi)存轉(zhuǎn)儲快照,不推薦使用,消耗資源而且慢 |
jstack(Stack Trace for Java) | 顯示虛擬機(jī)的線程快照 |
JConsole | JMX的可視化管理工具 |
VisualVM | 多合一故障管理工具 |
常見的幾個工具都已經(jīng)列出來了,還有一些其他的工具,其實(shí)用起來比JDK自帶的還要好,我會在今后的文章中列出來。OK,我們就一個一個去分析一下這些工具是干嘛的,以及如何去使用的。
二、工具
1、jps:虛擬機(jī)進(jìn)程狀況工具
jps主要用來輸出JVM中運(yùn)行的進(jìn)程狀態(tài)信息。語法格式如下:
- jps [options] [hostid]
- 第一個參數(shù):options
- -q 不輸出類名、Jar名和傳入main方法的參數(shù)
- -m 輸出傳入main方法的參數(shù)
- -l 輸出main類或Jar的全限名
- -v 輸出傳入JVM的參數(shù)
- 第二個參數(shù):hostid
主機(jī)或者是服務(wù)器的id,如果不指定,就默認(rèn)為當(dāng)前的主機(jī)或者是服務(wù)器。
我是在Windows10系統(tǒng)下測試的,當(dāng)然你可以在linux下試驗(yàn),方式是一樣的,結(jié)果可能有不同。你可以選擇不同的參數(shù)選項(xiàng)來進(jìn)行測試。打開CMD輸入相應(yīng)命令
2、jstack:堆棧跟蹤工具
jstack用于生成虛擬機(jī)當(dāng)前時刻的線程快照。語法格式如下:
- jstack [option] vmid
- 第一個參數(shù):option
- 選項(xiàng) 作用
- -F 當(dāng)正常輸出的請求不被相應(yīng)時候,強(qiáng)制輸出線程堆棧
- -l 出堆棧外,顯示關(guān)于鎖的附加信息
- -m 如果調(diào)用本地方法的話,可以顯示C/C++的堆棧
- 第二個參數(shù):vmid
vmid是Java虛擬機(jī)ID,在Linux/Unix系統(tǒng)上一般就是進(jìn)程ID。
我們直接在CMD中操作一下:
3、jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)控工具
jstat監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息,可以顯示本地或者是遠(yuǎn)程虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運(yùn)行數(shù)據(jù)。語法格式如下:
- jstat [ generalOption | outputOptions vmid [interval] [count]] ]
- 第一個參數(shù):generalOption | outputOptions
這個參數(shù)表示的option,代表著用戶希望查詢的虛擬機(jī)信息,分為類加載、垃圾收集、運(yùn)行期編譯狀況3類。
第二個參數(shù):vmid
vmid是Java虛擬機(jī)ID,在Linux/Unix系統(tǒng)上一般就是進(jìn)程ID。
第三個參數(shù):interval
interval是采樣時間間隔,
第四個參數(shù):count
count表示的是采樣數(shù)。
下面我們就是用一下這個工具,打開我們的CMD,輸入相應(yīng)的命令:
4、jinfo:實(shí)時地查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)
命令格式:
- jinfo [option] pid
第一個參數(shù):option
- 選項(xiàng) 作用
- -v 查看虛擬機(jī)啟動時顯示指定的參數(shù)列表
- -flag 查看虛擬機(jī)啟動時未被指定的參數(shù)的默認(rèn)值
- -sysprops 打印虛擬機(jī)進(jìn)程的System.getProperties()的內(nèi)容
第二個參數(shù):pid
指定顯示的進(jìn)程id。
在CMD中進(jìn)行測試:
5、jmap:生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲快照(heapdump文件)
jmap(Memory Map for Java,內(nèi)存映像工具),用于生成堆轉(zhuǎn)存的快照,一般是heapdump或者dump文件。如果不適用jmap命令,可以使用-XX:+HeapDumpOnOutOfMemoryError參數(shù),當(dāng)虛擬機(jī)發(fā)生內(nèi)存溢出的時候可以產(chǎn)生快照?;蛘呤褂胟ill -3 pid也可以產(chǎn)生。jmap的作用并不僅僅是為了獲取dump文件,它可以查詢finalize執(zhí)行隊(duì)列,java堆和永久代的詳細(xì)信息,如空間使用率,當(dāng)前用的哪種收集器。命令格式如下:
- jmap [option] vmid
第一個參數(shù):
第二個參數(shù):vmid
vmid是Java虛擬機(jī)ID,在Linux/Unix系統(tǒng)上一般就是進(jìn)程ID.
在cmd中測試:
6、jhat:分析內(nèi)存轉(zhuǎn)儲快照,不推薦使用,而且慢
由于這個工具功能比較簡陋,運(yùn)行起來也比較耗時,所以這個工具不推薦使用,推薦使用MAT。
7、JConsole:JMX的可視化管理工具
這個工具相比較前面幾個工具,使用率比較高,很重要。它是一個java GUI監(jiān)視工具,可以以圖表化的形式顯示各種數(shù)據(jù)。并可通過遠(yuǎn)程連接監(jiān)視遠(yuǎn)程的服務(wù)器VM。用java寫的GUI程序,用來監(jiān)控VM,并可監(jiān)控遠(yuǎn)程的VM,非常易用,而且功能非常強(qiáng)。
在cmd里面輸入 jconsole,選則進(jìn)程就可以了。(前提是在IDE工具先建立一個線程運(yùn)行著)
然后我們選擇了相應(yīng)的選項(xiàng)之后,進(jìn)入這個工具就會出現(xiàn)下面這個界面
在上面有菜單,我們可以選擇其中一個進(jìn)行查看,就可以了,這個用具用起來很方便,也是我之前用的比較多的工具。
8、VisualVM:多合一故障管理工具
這個工具也很牛bility。它同jconsole都是一個基于圖形化界面的、可以查看本地及遠(yuǎn)程的JAVA GUI監(jiān)控工具,Jvisualvm同jconsole的使用方式一樣,直接在命令行打入jvisualvm即可啟動,jvisualvm界面更美觀一些,數(shù)據(jù)更實(shí)時:
最上面也有菜單,你可以選擇不同的選項(xiàng)來展示。自己動手試一遍是最好的。
三、總結(jié)
這些工具就先寫這么多,在文章一開始我們其實(shí)已經(jīng)發(fā)現(xiàn)了,jdk自帶的工具那是超級的多,而且隨著jdk版本的不斷更新,工具還有不斷加強(qiáng)增多的趨勢,想要每一個都掌握那太費(fèi)時間了,我們遇到哪些問題去搜索一下,看看能用到哪些工具就可以了,列出的這幾種工具,對于初學(xué)者來說還是比較適用的。
本文轉(zhuǎn)載自微信公眾號「愚公要移山」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系愚公要移山公眾號。