?轉自:http://blog.csdn.net/winwill2012/article/details/46364923



jps命令使用

jps命令類似于Linux下的ps命令,用于列出當前正在運行的所有Java進程。

基本用法

直接運行不加任何參數就能列出所有java進程的pid和類的短名稱。例如:

這里寫圖片描述

常用參數

-q參數

-q可以指定jps只列出pid,而不輸出類的短名稱,例如:

這里寫圖片描述

-m參數

-m參數可以用于列出傳遞給java進程主函數的參數,例如:

這里寫圖片描述
這里可以看到傳遞給jps(jps本身也是java進程)進程的參數就是-m

-l參數

-l參數用于輸出主類的完整路徑,例如:

這里寫圖片描述

-v參數

-v參數可以列出傳遞給java虛擬機的參數,例如:

這里寫圖片描述

jstat命令使用

概述

jstat是一個可以用于觀察Java應用程序運行時相關信息的工具,功能非常強大,可以通過它查看堆信息的詳細情況。

基本用法

jstat命令的基本使用語法如下:

jstat -option [-t] [-h] pid [interval] [count]

  • 選項option可以由以下值構成。?

    • -class:顯示ClassLoader的相關信息。

    • -compiler:顯示JIT編譯的相關信息。

    • -gc:顯示與gc相關的堆信息。

    • -gccapacity:顯示各個代的容量及使用情況。

    • -gccause:顯示垃圾回收的相關信息(同-gcutil),同時顯示最后一次或當前正在發生的垃圾回收的誘因。

    • -gcnew:顯示新生代信息。

    • -gcnewcapacity:顯示新生代大小與使用情況。

    • -gcold:顯示老生代和永久代的信息。

    • -gcoldcapacity:顯示老年代的大小。

    • -gcpermcapacity:顯示永久代的大小。

    • -gcutil:顯示垃圾收集信息。

    • -printcompilation:輸出JIT編譯的方法信息。

  • -t參數可以在輸出信息前面加上一個Timestamp列,顯示程序運行的時間。

  • -h參數可以在周期性的數據輸出時,輸出多少行數據后,跟著輸出一個表頭信息。

  • interval參數用于指定輸出統計數據的周期,單位為毫秒(ms)。

  • count參數用于指定一共輸出多少次數據。

詳細使用

-class使用

下面命令輸出pid為2500這個進程的ClassLoader相關信息,每秒統計一次信息,一共輸出兩次。?
這里寫圖片描述
Loaded表示載入的類的數量,第一個Bytes表示載入的類的合計大小,Unloaded表示卸載的類數量,第二個Bytes表示卸載的類的合計大小,Time表示加載和卸載類花的總的時間。

-compiler使用

下面的命令查看JIT編譯的信息:?
這里寫圖片描述

Compiled表示編譯任務執行的次數,Failed表示編譯失敗的次數,Invalid表示編譯不可用的次數,Time表示編譯的總耗時,FailedType表示最后一次編譯的類型,FailedMethod表示最后一次編譯失敗的類名和方法名。

-gc使用

下面的命令顯示與gc相關的堆信息的輸出:?
這里寫圖片描述

  • S0C:s0(from)的大小(KB)

  • S1C:s1(from)的大小(KB)

  • S0U:s0(from)已使用的空間(KB)

  • S1U:s1(from)已經使用的空間(KB)

  • EC:eden區的大小(KB)

  • EU:eden區已經使用的空間(KB)

  • OC:老年代大小(KB)

  • OU:老年代已經使用的空間(KB)

  • PC:永久區大小(KB)

  • PU:永久區已經使用的空間(KB)

  • YGC:新生代gc次數

  • YGCT:新生代gc耗時

  • FGC:Full gc次數

  • FGCT:Full gc耗時

  • GCT:gc總耗時

-gccapacity使用

下面的命令顯示了各個代的信息,與-gc相比,它不僅輸出了各個代的當前大小,還輸出了各個代的最大值與最小值:?
這里寫圖片描述
* NGCMN:新生代最小值(KB)?
* NGCMX:新生代最大值(KB)?
* NGC:當前新生代大小(KB)?
* OGCMN:老年大最小值(KB)?
* OGCMX:老年代最大值(KB)?
* OGC:當前老年代大小(KB)?
* PGCMN:永久代最小值(KB)?
* PGCMX:永久代最大值(KB)

-gccause使用

下面命令顯示最近一次gc的原因,以及當前gc的原因:?
這里寫圖片描述

  • LGCC:上次gc的原因,從圖中可以看到上次gc的原因是Allocation Failure

  • GCC:當前gc的原因,圖中當前沒有gc

-gcnew使用

下面的命令顯示新生代的詳細信息:?
這里寫圖片描述
* TT:新生代對象晉升到老年代對象的年齡。?
* MTT:新生代對象晉升到老年代對象的年齡的最大值。?
* DSS:所需的Survivor區的大小。

-gcnewcapacity使用

下面的命令詳細輸出了新生代各個區的大小信息:?
這里寫圖片描述
* S0CMX:s0區的最大值(KB)?
* S1CMX:s1區的最大值(KB)?
* ECMX:eden區的最大值(KB)

-gcold使用

下面的命令顯示老年代gc概況:?
這里寫圖片描述

-gcoldcapacity使用

下面的命令用于顯示老年代的容量信息:?
這里寫圖片描述

-gcpermcapacity使用

下面的命令用于顯示永久區的使用情況:?
這里寫圖片描述


?

jinfo命令使用

概述

jinfo可以用來查看正在運行的Java運用程序的擴展參數,甚至支持在運行時動態地更改部分參數,他的基本使用語法如下:

jinfo -< option > < pid >

其中option可以為以下信息:?
* -flag< name >: 打印指定java虛擬機的參數值。?
* -flag [+|-]< name >:設置或取消指定java虛擬機參數的布爾值。?
* -flag < name >=< value >:設置指定java虛擬機的參數的值。

使用示例

  1. 下面的命令顯示了新生代對象晉升到老年代對象的最大年齡。在運行程序運行時并沒有指定這個參數,但是通過jinfo,可以查看這個參數的當前的值。?
    這里寫圖片描述

  2. 下面的命令顯示是否打印gc詳細信息:?
    這里寫圖片描述

  3. 下面的命令在運用程序運行時動態打開打印詳細gc信息開關:?
    這里寫圖片描述

注意事項

jinfo雖然可以在java程序運行時動態地修改虛擬機參數,但并不是所有的參數都支持動態修改。


jmap命令使用

概述

jmap是一個多功能的命令。它可以生成Java程序的堆dump文件,也可以查看堆內對象實例的統計信息,查看ClassLoader的信息以及Finalizer隊列。

使用示例

導出對象統計信息

下面的命令生成PID為2500的java成粗的對象的統計信息,并輸出到out.txt文件中:

[qifuguang@winwill~]$?jmap?-histo?2500?>?out.txt
[qifuguang@winwill~]$[qifuguang@winwill~]$[qifuguang@winwill~]$[qifuguang@winwill~]$[qifuguang@winwill~]$123456123456

生成的文件如下:?
這里寫圖片描述
從文件中可以看到,統計信息顯示了內存中實例的數量和合計。

導出程序堆快照

下面的命令導出PID為2500的java程序當前的堆快照:

[qifuguang@winwill~]$?jmap?-dump:format=b,file=dump.bin?2500Dumping?heap?to?/home/qifuguang/dump.bin?...Heap?dump?file?created123123

該命令成功地將運用程序的當前的堆快照導出到了dump.bin文件,之后可以使用Visual VM,MAT等工具分析對快照文件。

查看Finalizer隊列

下面的命令查看虛擬機Finalizer隊列的信息:?
這里寫圖片描述
從圖中可以看到,隊列中堆積了大量的TestFinalizer$LY對象實例,還有其他一些對象。

查看ClassLoader信息

下面的命令顯示了虛擬機當前的ClassLoader信息:?
這里寫圖片描述
從圖中可以看到,當前虛擬機一共有3個ClassLoader,bootstrap加載了492個對象,對象總大小為943655byte,同時還顯示了各個ClassLoader之間的父子關系。


jhat命令使用

概述

jhat(Java?Head Analyse Tool)是jdk自帶的用來分析Java堆快照的工具,具體的使用方法是:

jhat dump_file_name

使用示例

在此以前文dump出來的文件(dump.bin)為例,演示怎么使用jhat分析堆文件。?
這里寫圖片描述
這里寫圖片描述

上圖中使用jhat命令打開了之前dump出來的堆快照文件,可以看到,命令成功執行后會在命令執行的本機啟動一個http服務,可以在瀏覽器上打開本機的7000端口查看詳細的分析結果:

這里寫圖片描述

頁面中顯示了所有非平臺類信息,點擊鏈接進入,可以查看選中的類的超類,ClassLoader以及該類的實例等信息。此外,在頁面的地步,jhat還為開發人員提供了其他查詢方式。如圖所示:

這里寫圖片描述

通過這些鏈接,開發人員可以查看所有類信息(包含java平臺的類),所有根節點,finalizer對象等等信息。最后提供了OQL查詢工具,開發人員可以輸入OQL語言查詢相應的類。關于OQL,筆者就不過多介紹,想了解更多的可以點擊這里了解。

?

jstack命令使用

概述

jstack可用于導出Java運用程序的線程堆棧,其基本使用語法為:

jstack [-l] pid

-l 選項用于打印鎖的額外信息。

使用示例

下面這段代碼運行之后會出現死鎖現象(因為線程1持有lock1,在等待lock2,線程2持有lock2在等待lock1,造成了循環等待,形成死鎖):

package?com.winwill.deadlock;/***?@author?qifuguang*?@date?15/6/4?16:45*/public?class?TestDeadLock?{private?static?final?Object?lock1?=?new?Object();????private?static?final?Object?lock2?=?new?Object();????public?static?void?main(String[]?args)?{Thread?t1?=?new?Thread(new?Runnable()?{????????????@Overridepublic?void?run()?{????????????????synchronized?(lock1)?{????????????????????try?{Thread.sleep(1000);}?catch?(Exception?e)?{e.printStackTrace();}????????????????????synchronized?(lock2)?{System.out.println("線程1執行....");}}}});Thread?t2?=?new?Thread(new?Runnable()?{????????????@Overridepublic?void?run()?{????????????????synchronized?(lock2)?{????????????????????try?{Thread.sleep(1000);}?catch?(Exception?e)?{e.printStackTrace();}????????????????????synchronized?(lock1)?{System.out.println("線程2執行...");}}}});t1.start();t2.start();}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

我們運行這段代碼,然后使用jstack命令導出這個程序的線程堆棧信息:

[qifuguang@Mac~]$ jstack -l 21023 > /tmp/deadlock.txt

打開導出的線程堆棧信息文件,文件末尾如下所示:

這里寫圖片描述

如圖所示,導出的線程堆棧文件中明確提示發現死鎖,并且指明了死鎖的原因。

總結

jstack不僅能夠導出線程堆棧,還能自動進行死鎖檢測,輸出線程死鎖原因。


?jcmd命令使用

概述

在JDK 1.7之后,新增了一個命令行工具jcmd。它是一個多功能工具,可以用來導出堆,查看Java進程,導出線程信息,執行GC等。

使用示例

下面這個命令能夠列出當前運行的所有虛擬機:

這里寫圖片描述

參數-l表示列出所有java虛擬機,針對每一個虛擬機,可以使用help命令列出該虛擬機支持的所有命令,如下圖所示,以21024這個進程為例:

這里寫圖片描述

查看虛擬機啟動時間VM.uptime

這里寫圖片描述

打印線程棧信息Thread.print

這里寫圖片描述

查看系統中類統計信息GC.class_histogram

執行如下命令:

[qifuguang@Mac~]$ jcmd 21024 GC.class_histogram

得到結果如下:?
這里寫圖片描述

導出堆信息GC.heap_dump

使用如下命令可以導出當前堆棧信息,這個命令功能和?jmap -dump?
功能一樣

這里寫圖片描述

獲取系統Properties內容VM.system_properties

這里寫圖片描述

獲取啟動參數VM.flags

這里寫圖片描述

獲取所有性能相關數據PerfCounter.print

這里寫圖片描述

總結

從以上示例可以看出,jcmd擁有jmap的大部分功能,并且Oracle官方也建議使用jcmd代替jmap。