JVM-JDK自帶命令列工具
JDK自帶命令列工具
1. jps-檢視Java程序
jps命令相當於Linux下的ps命令,只不過它只列出Java程序。
jps
:列出Java程式程序ID和Main函式名稱jps -q
:只輸出程序IDjps -m
:輸出傳遞給Java程序(主函式)的引數jps -l
:輸出主函式的完整路徑jps -v
:顯示傳遞給Java虛擬的引數
2. jstat-檢視虛擬機器執行時資訊
jstat可以檢視Java程式執行時相關資訊,可以通過它檢視堆資訊的相關情況
jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
options
:由以下值構成
-class
:顯示ClassLoader的相關資訊-compiler
:顯示JIT編譯的相關資訊-gc
:顯示與GC相關資訊-gccapacity
:顯示各個代的容量和使用情況-gccause
:顯示垃圾收集相關資訊(同-gcutil
),同時顯示最後一次或當前正在發生的垃圾收集的誘發原因-gcnew
:顯示新生代資訊-gcnewcapacity
:顯示新生代大小和使用情況-gcold
:顯示老年代資訊-gcoldcapacity
:顯示老年代大小-gcpermcapacity
:顯示永久代大小-gcutil
:顯示垃圾收集資訊-printcompilation
-t
:在輸出資訊前加上一個Timestamp列,顯示程式的執行時間-h
:可以在週期性資料輸出後,輸出多少行資料後,跟著一個表頭資訊interval
:用於指定輸出統計資料的週期,單位為毫秒count
:用於指定一個輸出多少次資料
測試:
jstat -class -t 6864 1000 2
輸出ClassLoader資訊
jstat -compiler -t 6864
檢視JIT編譯資訊
Compiled
:編譯任務執行次數Failed
:編譯失敗次數Invalid
:編譯不可用次數Time
:編譯總耗時FailedType
:最後一次編譯失敗型別FailedMethod
jstat -gc 6864
GC相關堆資訊
S0C,S1C
:S0和S1(from區)大小 KBS0U,S1U
:S0和S1(from區)已使用大小 KBEC,OC,PC
:eden,old,perm大小 KBEU,OU,PU
:eden,old,perm已使用大小 KBYGC,FGC
:新生代GC,FullGC次數YGCT,FGCT
:新生代GC,FullGC耗時GCT
:GC總耗時
jstat -gccapacity 6864
:檢視各個代大小
NGCMN,NGC,OGCMN,PGCMN
:新,當前新生代,老,持的最小值 KBNGCMX,OGCMX,PGCMX
:新,老,持的最大值KB
jstat -gccause 6864
:顯示GC原因
LGCC
:上次GC原因GCC
:這次GC原因
jstat -gcnew 6864
:檢視新生代詳細引數
TT
:新生代晉升到老年代年齡MTT
:新生代晉升到老年代年齡最大值DSS
:所需survivor大小
jstat -gcnewcapacity 6864
:輸出新生代各區大小
S0CMX
:S0最大值KBS1CMX
:S1最大值KBECMX
:eden區最大值 KB
jstat -gcutil 6864
: 檢視相關百分比
S0,S1,E,O,P
:s0,s1,eden,old,perm使用的百分比
3. jinfo-檢視虛擬機器引數
jinfo可以用來檢視正在執行的java程式的擴充套件引數,甚至支援執行時,修改部分引數
jinfo [option] <pid>
-flag <name>
to print the value of the named VM flag-flag [+|-]<name>
to enable or disable the named VM flag-flag <name>=<value>
to set the named VM flag to the given value-flags
to print VM flags-sysprops
to print Java system properties<no option>
to print both of the above-h | -help
to print this help message
info不僅可以檢視引數,還可以修改引數
4. jmap-匯出堆到檔案
jmap可以生成Java程式的堆的Dump檔案,也可以檢視堆內物件例項的統計資訊,檢視ClassLoader的資訊以及finalizer佇列
jmap -histo 11512 >c:/MyFile/s.txt
:生成PID為11512的Java程式的物件統計資訊,並輸出到s.txt中
jmap -dump:format=b,file=c:\MyFile\heap.hprof 11652
:等到Java程式的當前堆快照。然後可以用各種工具分析該檔案。
jmap -finalizerinfo 11652
: 觀察系統finalizer佇列中的物件,一個不恰當的finalize()方法可能導致物件堆積在finalizer佇列中,使用上面的引數可以檢視堆積在finalizer佇列中的物件。
5. jhat——JDK自帶的堆分析工具
jhat c:\MyFile\heap.hprof
:利用jhat分析剛剛jmap輸出的堆檔案。
jhat分析完後,使用http伺服器展示分析結果,在瀏覽器中訪問:
6. jstack——檢視執行緒堆疊
測試下面程式碼:
package com.liuyao;
/**
* 一個簡單的死鎖類
* 當DeadLock類的物件flag==1時(td1),先鎖定o1,睡眠500毫秒
* 而td1在睡眠的時候另一個flag==0的物件(td2)執行緒啟動,先鎖定o2,睡眠500毫秒
* td1睡眠結束後需要鎖定o2才能繼續執行,而此時o2已被td2鎖定;
* td2睡眠結束後需要鎖定o1才能繼續執行,而此時o1已被td1鎖定;
* td1、td2相互等待,都需要得到對方鎖定的資源才能繼續執行,從而死鎖。
*/
public class DeadLock implements Runnable {
public int flag = 1;
//靜態物件是類的所有物件共享的
private static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag :"+flag);
if (flag == 1) {
synchronized (o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1");
}
}
}
if (flag == 0) {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock td1 = new DeadLock();
DeadLock td2 = new DeadLock();
td1.flag = 1;
td2.flag = 0;
//td1,td2都處於可執行狀態,但JVM執行緒排程先執行哪個執行緒是不確定的。
//td2的run()可能在td1的run()之前執行
new Thread(td1).start();
new Thread(td2).start();
}
}
通過命令列輸入 jstack
命令檢視:
jstack -l 23612 >c:\MyFile\deadlock.txt
: -l 會列印鎖的附加資訊。
檢視輸出的deadlock.txt檔案,我們會發現:
7. jstatd——遠端主機資訊收集
jstatd
是一個RMI服務端程式,它的作用相當於代理伺服器,建立本地計算機與遠端監控工具的通訊。
8. jcmd——多功能命令列
在JDK1.7後新增的一個命令列工具jcmd,它是一個多功能工具,可以用它來匯出堆,檢視Java程序,匯出執行緒資訊,執行GC等。
jcmd -l
:列出當前系統中的所有Java虛擬機器
jcmd 12720 help
:針對每一個虛擬機器,jcmd可以使用help列出它們所支援的命令。