?轉自: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虛擬機的參數的值。
使用示例
下面的命令顯示了新生代對象晉升到老年代對象的最大年齡。在運行程序運行時并沒有指定這個參數,但是通過jinfo,可以查看這個參數的當前的值。?
下面的命令顯示是否打印gc詳細信息:?
下面的命令在運用程序運行時動態打開打印詳細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。
轉載于:https://blog.51cto.com/as007012/1911629