1. 程式人生 > >JVM-JDK自帶命令列工具

JVM-JDK自帶命令列工具

JDK自帶命令列工具

1. jps-檢視Java程序

jps命令相當於Linux下的ps命令,只不過它只列出Java程序。

  • jps :列出Java程式程序ID和Main函式名稱
  • jps -q :只輸出程序ID
  • jps -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
      :輸出JIT編譯的方法資訊
  • -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區)大小 KB
  • S0U,S1U:S0和S1(from區)已使用大小 KB
  • EC,OC,PC:eden,old,perm大小 KB
  • EU,OU,PU:eden,old,perm已使用大小 KB
  • YGC,FGC:新生代GC,FullGC次數
  • YGCT,FGCT:新生代GC,FullGC耗時
  • GCT:GC總耗時

jstat -gccapacity 6864 :檢視各個代大小

  • NGCMN,NGC,OGCMN,PGCMN:新,當前新生代,老,持的最小值 KB
  • NGCMX,OGCMX,PGCMX:新,老,持的最大值KB

jstat -gccause 6864:顯示GC原因

  • LGCC:上次GC原因
  • GCC:這次GC原因

jstat -gcnew 6864 :檢視新生代詳細引數

  • TT:新生代晉升到老年代年齡
  • MTT:新生代晉升到老年代年齡最大值
  • DSS:所需survivor大小

jstat -gcnewcapacity 6864:輸出新生代各區大小

  • S0CMX:S0最大值KB
  • S1CMX:S1最大值KB
  • ECMX: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列出它們所支援的命令。