在平時的開發當中咱們老是會遇到各類各樣的問題,好比說內存泄漏、死鎖、CPU等。遇到問題不可怕,關鍵是咱們如何去排查這些錯誤,對症下藥纔是根本。不過對於不少人來講,每每找不到這些問題的根本所在,所以這篇文章主要是讓咱們掌握一些工具來分析究竟是哪裏出現了問題。java
在以前的文章中,主要是分析了JVM的內存結構、類加載機制和垃圾回收機制。文章的順序也是按部就班的,從這篇文章當中咱們主要是分析JDK自帶的工具,把理論應用於實踐。linux
首先咱們先對幾種要講的工具進行一個概述,而後再分別分析:服務器
工具主要是爲了解決問題而生的,就是因爲咱們的程序存在着一些性能問題,纔有了這些工具。其實當咱們在下載完成JDK以後,那些工具就被SUN公司隨之送給咱們了。工具
咱們能夠在咱們的JDK安裝目錄,下看看會有不少這樣的工具。性能
咱們會發現不少這樣的exe文件,這裏面有不少都是性能監控工具。咱們就抽出來幾個進行講解。測試
工具名稱spa
主要做用命令行
jps(JVM Process Status Tool)線程
顯示指定系統中全部的HotSpot虛擬機進程3d
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,咱們就一個一個去分析一下這些工具是幹嗎的,以及如何去使用的。
jps主要用來輸出JVM中運行的進程狀態信息。語法格式以下:
`jps [options] [hostid]
`
第一個參數:options
`-q 不輸出類名、Jar名和傳入main方法的參數
-m 輸出傳入main方法的參數
-l 輸出main類或Jar的全限名
-v 輸出傳入JVM的參數
`
第二個參數:hostid
主機或者是服務器的id,若是不指定,就默認爲當前的主機或者是服務器。
我是在Windows10系統下測試的,固然你能夠在linux下試驗,方式是同樣的,結果可能有不一樣。你能夠選擇不一樣的參數選項來進行測試。打開CMD輸入相應命令
jstack用於生成虛擬機當前時刻的線程快照。語法格式以下:
`jstack [option] vmid
`
第一個參數:option
選項
做用
-F
當正常輸出的請求不被相應時候,強制輸出線程堆棧
-l
出堆棧外,顯示關於鎖的附加信息
-m
若是調用本地方法的話,能夠顯示C/C++的堆棧
第二個參數:vmid
vmid是Java虛擬機ID,在Linux/Unix系統上通常就是進程ID。
咱們直接在CMD中操做一下:
jstat監視虛擬機各類運行狀態信息,能夠顯示本地或者是遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。語法格式以下:
`jstat [ generalOption | outputOptions vmid [interval] [count]] ]
`
第一個參數:generalOption | outputOptions
這個參數表示的option,表明着用戶但願查詢的虛擬機信息,分爲類加載、垃圾收集、運行期編譯情況3類。
第二個參數:vmid
vmid是Java虛擬機ID,在Linux/Unix系統上通常就是進程ID。
第三個參數:interval
interval是採樣時間間隔,
第四個參數:count
count表示的是採樣數。
下面咱們就是用一下這個工具,打開咱們的CMD,輸入相應的命令:
命令格式:
`jinfo [option] pid
`
第一個參數:option
選項
做用
-v
查看虛擬機啓動時顯示指定的參數列表
-flag
查看虛擬機啓動時未被指定的參數的默認值
-sysprops
打印虛擬機進程的System.getProperties()的內容
第二個參數:pid
指定顯示的進程id。
在CMD中進行測試:
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中測試:
因爲這個工具功能比較簡陋,運行起來也比較耗時,因此這個工具不推薦使用,推薦使用MAT。
這個工具相比較前面幾個工具,使用率比較高,很重要。它是一個java GUI監視工具,能夠以圖表化的形式顯示各類數據。並可經過遠程鏈接監視遠程的服務器VM。用java寫的GUI程序,用來監控VM,並可監控遠程的VM,很是易用,並且功能很是強。
在cmd裏面輸入 jconsole,選則進程就能夠了。(前提是在IDE工具先創建一個線程運行着)
而後咱們選擇了相應的選項以後,進入這個工具就會出現下面這個界面
在上面有菜單,咱們能夠選擇其中一個進行查看,就能夠了,這個用具用起來很方便,也是我以前用的比較多的工具。
這個工具也很牛bility。它同jconsole都是一個基於圖形化界面的、能夠查看本地及遠程的JAVA GUI監控工具,Jvisualvm同jconsole的使用方式同樣,直接在命令行打入jvisualvm便可啓動,jvisualvm界面更美觀一些,數據更實時:
最上面也有菜單,你能夠選擇不一樣的選項來展現。本身動手試一遍是最好的。
這些工具就先寫這麼多,在文章一開始咱們其實已經發現了,jdk自帶的工具那是超級的多,並且隨着jdk版本的不斷更新,工具還有不斷增強增多的趨勢,想要每個都掌握那太費時間了,咱們遇到哪些問題去搜索一下,看看能用到哪些工具就能夠了。