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