前言
JDK本身提供了很多友善的JVM性能調優監控工具,除了jps、jstat、jinfo、jmap、jhat、jstack等小巧的工具,還有內建式的jvisualvm和jconsole。
1、jps
jps(JVM Process Status Tool,虛拟機程序監控工具),這個指令可以列出正在運作的虛拟機程序,并顯示虛拟機執行主類名稱,以及這些程序的本地虛拟機唯一ID。這個ID被稱為本地虛拟機唯一ID(local virtual Machine Identifier,簡寫為LVMID)。如果你在linux的一台伺服器上使用jps得到的LVMID其實就是和ps 指令得到的PID是一樣的。
文法格式如下:
jps [options] [hostid]
如果不指定hostid就預設為目前主機或伺服器。

options參數選項說明如下:
-q 不輸出類名、Jar名和傳入main方法的參數
-m 輸出傳入main方法的參數
-l 輸出main類或Jar的全限名
-v 輸出傳入JVM的參數
例如:檢視所有的java程序
2、jinfo
這個指令可以實時地檢視和調整虛拟機各項參數。
主要參數如下:
例如:檢視程序ID為12366的MaxPermSize大小可以用下面指令
3、jhat
jhat(虛拟機堆轉儲快照分析工具),這個工具是用來分析jmap dump出來的檔案。由于這個工具功能比較簡陋,運作起來也比較耗時,是以這個工具不推薦使用,這裡也不進行介紹了。
4、jmap
jmap(Memory Map for Java,記憶體映像工具),用于生成堆轉存的快照,一般是heapdump或者dump檔案。如果不适用jmap指令,可以使用-XX:+HeapDumpOnOutOfMemoryError參數,當虛拟機發生記憶體溢出的時候可以産生快照。或者使用kill -3 pid也可以産生。jmap的作用并不僅僅是為了擷取dump檔案,它可以查詢finalize執行隊列,java堆和永久代的詳細資訊,如空間使用率,目前用的哪種收集器。
jmap的指令格式:
jmap [option] vmid
主要參數如下:
option參數說明:
-dump:[live,]format=b,file= 使用hprof二進制形式,輸出jvm的heap内容到檔案=. live子選項是可選的,假如指定live選項,那麼隻輸出活的對象到檔案.
-finalizerinfo 列印正等候回收的對象的資訊.
-heap 列印heap的概要資訊,GC使用的算法,heap的配置及wise heap的使用情況.
-histo[:live] 列印每個class的執行個體數目,記憶體占用,類全名資訊. VM的内部類名字開頭會加上字首”*”. 如果live子參數加上後,隻統計活的對象數量.
-permstat 列印classload和jvm heap長久層的資訊. 包含每個classloader的名字,活潑性,位址,父classloader和加載的class數量. 另外,内部String的數量和占用記憶體數也會列印出來.
-F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.
-h | -help 列印輔助資訊
-J 傳遞參數給jmap啟動的jvm
例如:列印每個class的執行個體數目,記憶體占用,類全名資訊
jmap -histo 12366
資訊太長了,就貼最後幾行了:
5、jstat
jstat(JVM Statistics Monitoring Tool,虛拟機統計資訊監視工具),這個指令用于監視虛拟機各種運作狀态資訊。它可以顯示本地或者遠端虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料,雖然沒有GUI圖形界面,隻是提供了純文字控制台環境的伺服器上,但它是運作期間定位虛拟機性能問題的首選工具。
文法格式如下:
jstat [option vmid [interval [s | ms] [count ] ] ]
說明:vmid是Java虛拟機ID,在Linux/Unix系統上一般就是程序ID。interval是采樣時間間隔。count是采樣數目,下面看看jstat工具的主要選項。
例如:需要每250毫秒查詢一次程序12366 垃圾收集狀況,一共查詢10次
6、jstack
jstack(Java Stack Trace,Java堆棧跟蹤工具),這個指令用于檢視虛拟機目前時刻的線程快照(一般是threaddump 或者 javacore檔案)。線程快照就是目前虛拟機内每一條線程正在執行的方法堆棧的集合。生成線程快照的主要目的是定位線程出現長時間停頓的原因,入線程間死鎖、死循環、請求外部資源導緻的長時間等待都是導緻線程長時間停頓的常見原因。線程出現停頓的時候通過jstack來檢視各個線程的調用堆棧,就可以知道沒有響應的線程到底在背景做些什麼事情。
指令格式:
jstack [option] vmid
例如:檢視程序12366的堆棧資訊(大小限制,隻截取部分)
結束語
限于篇幅,內建式的jvisualvm和jconsole留在下一篇再和大家一起去讨論。