在JDK的bin目錄下有不少命令行工具:html
咱們能夠看到各個工具的體積基本上都穩定在27kb左右,這個不是JDK開發團隊刻意爲之的,而是由於這些工具大多數是jdk\lib\tools.jar類庫的一層薄包裝而已,他們的主要功能代碼是在tools類庫中實現的。命令行工具的好處是:當應用程序部署到生產環境後,不管是直接接觸物理服務器仍是遠程telnet到服務器上都會受到限制。而藉助tools.jar類庫裏面的接口,咱們能夠直接在應用程序中實現功能強大的監控分析功能。java
此次我主要介紹以下的一些使用工具:linux
一、jps:查看本機java進程信息。程序員
二、jstack:打印線程的棧信息,製做線程dump文件。web
三、jmap:打印內存映射,製做堆dump文件瀏覽器
四、jstat:性能監控工具服務器
五、jhat:內存分析工具多線程
六、jconsole:簡易的可視化控制檯工具
七、jvisualvm:功能強大的控制檯性能
JAVA Dump就是虛擬機運行時的快照,將虛擬機運行時的狀態和信息保存到文件中:
線程dump:包含全部線程的運行狀態,純文本格式
堆dump:包含全部堆對象的狀態,二進制格式
java dump能夠在任何java環境使用,信息量充足,針對非功能性性的bug,主要爲多線程開發、內存泄漏。
顯示當前全部java進程pid的命令,咱們能夠經過這個命令來查看到底啓動了幾個java進程(由於每個java程序都會獨佔一個java虛擬機實例),不過jps有個缺點是隻能顯示當前用戶的進程id,要顯示其餘用戶的還只能用linux的ps命令。
執行jps命令,會列出全部正在運行的java進程,其中jps命令也是一個java程序,前面的數字就是對應的進程id,這個id的做用很是大,後面會有相關介紹。
jps -help:
jps -l 輸出應用程序main.class的完成package名或者應用程序jar文件完整路徑名
jps -v 輸出傳遞給JVM的參數
JPS失效
咱們在定位問題過程會遇到這樣一種狀況,用jps查看不到進程id,用ps -ef | grep java卻能看到啓動的java進程。
要解釋這種現象,先來了解下JSP的實現機制:
java程序啓動後,會在目錄/tmp/hsperfdata_{userName}/下生成幾個文件,文件名就是java進程的pid,所以jps列出進程id就是把這個目錄下的文件名列一下而已,至於系統參數,則是讀取文件中的內容。
咱們來思考下:若是因爲磁盤滿了,沒法建立這些文件,或者用戶對這些文件沒喲讀的權限。又或者由於某種緣由這些文件或者目錄被清除,出現以上這些狀況,就會致使jps命令失效。
若是jps命令失效,而咱們又要獲取pid,還可使用如下兩種方法:
一、top | grep java
二、ps -ef |grep java
主要用於生成虛擬機當前時刻的線程快照,線程快照是當前java虛擬機每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是用於定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使長時間等待。
使用命令打印堆棧很簡單,可是經過堆棧文件定位問題,須要很深厚的內功,這也是體現一個程序員的價值的一個方面。對於堆棧文件的分析思路,這裏不展開介紹,後面我會有專門介紹定位性能問題的文章。
主要用於打印指定java進程的共享對象內存映射或堆內存細節。
堆Dump是反映堆使用狀況的內存鏡像,其中主要包括系統信息、虛擬機屬性、完整的線程Dump、全部類和對象的狀態等。通常在內存不足,GC異常等狀況下,咱們會去懷疑內存泄漏,這個時候就會去打印堆Dump。
jmap的用法摘要:
一、jmap pid
打印的信息分別爲:共享對象的起始地址、映射大小、共享對象路徑的全程。
二、jmap -heap pid:查看堆使用狀況
三、jmap -histo pid:查看堆中對象數量和大小
打印的信息分別是:序列號、Class實例的數量、內存的佔用、類限定名
若是是內部類,類名的開頭會加上*,若是加上live子參數的話,如jmap -histo:live pid,這個命名會觸發一次FUll GC,只統計存活對象
四、jmap -dump:format=b,file=heapdump pid:將內存使用的詳細狀況輸出到文件
而後使用jhat命令查看該文件:jhat -port 4000 文件名 ,在瀏覽器中訪問http:localhost:4000/
總結:
該命令適用的場景是程序內存不足或者GC頻繁,這時候極可能是內存泄漏。經過以上命令查看堆使用狀況、大量對象被持續引用等狀況。
主要是對java應用程序的資源和性能進行實時的命令行監控,包括了對heap size和垃圾回收情況的監控。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
option:咱們常用的選項有gc、gcutil
vmid:java進程id
interval:間隔時間,單位爲毫秒
count:打印次數
一、jstat -gc PID 5000 20
S0C:年輕代第一個survivor的容量(字節)
S1C:年輕代第二個survivor的容量(字節)
S0U:年輕代第一個survivor已使用的容量(字節)
S1U:年輕代第二個survivor已使用的容量(字節)
EC:年輕代中Eden的空間(字節)
EU:年代代中Eden已使用的空間(字節)
OC:老年代的容量(字節)
OU:老年代中已使用的空間(字節)
PC:永久代的容量
PU:永久代已使用的容量
YGC:從應用程序啓動到採樣時年輕代中GC的次數
YGCT:從應用程序啓動到採樣時年輕代中GC所使用的時間(單位:S)
FGC:從應用程序啓動到採樣時老年代中GC(FULL GC)的次數
FGCT:從應用程序啓動到採樣時老年代中GC所使用的時間(單位:S)
二、jstat -gcutil PID 5000 20
s0:年輕代中第一個survivor已使用的佔當前容量百分比
s1:年輕代中第二個survivor已使用的佔當前容量百分比
E:年輕代中Eden已使用的佔當前容量百分比
O:老年代中已使用的佔當前容量百分比
P:永久代中已使用的佔當前容量百分比
主要用來解析java堆dump並啓動一個web服務器,而後就能夠在瀏覽器中查看堆的dump文件了。
生成dump文件的方法前面已經介紹了,這邊主要介紹如何解析java堆轉儲文件,並啓動一個web server
jhat heapdump
這個命令將heapdump文件轉換成html格式,而且啓動一個http服務,默認端口爲7000。
若是端口衝突,可使用如下命令指定端口:jhat -port 4000 heapdump
下面咱們來訪問下:ip:port
該頁面提供了幾個查詢功能,其中查看堆棧異常狀況主要看其中兩個查詢:
一、
二、