目錄
一、JDK命令列工具
1.1 jps:虛擬機行程狀況工具
1.2 jstat:虛擬機統計資訊監視工具
1.3 jinfo:Java配置資訊工具
1.4 jmap:Java記憶體映像工具
1.5 jhat:虛擬機堆轉儲快照分析工具
1.6 jstack:Java堆疊跟蹤工具
1.7 HSDIS:JIT生成代碼反匯編
二、JDK可視化工具
2.1 JConsole
2.2 VisualVM
三、總結
一、JDK命令列工具
注:此書是第二版,本章介紹的工具基于Windows平臺下的JDK 1.6 Update 21,
1.1 jps:虛擬機行程狀況工具
可以列出正在運行的虛擬機行程,并顯示虛擬機執行主類名稱(main函式所在類)以及這些行程的本地虛擬機唯一ID(Local Virtual Machine Identifier,LVMID),其常用選項見下表;
| 選項 | 作用 |
| -q | 只輸出LVMID |
| -m | 輸出虛擬機行程啟動時傳遞給main函式的引數 |
| -l | 輸出主類的全名,如果行程執行的是jar包,則輸出jar路徑 |
| -v | 輸出虛擬機啟動時的JVM引數 |
1.2 jstat:虛擬機統計資訊監視工具
用于監視虛擬機各種運行狀態資訊,它可以顯示本地或者遠程(需要遠程主機提供RMI支持)虛擬機行程中的類裝載、記憶體、垃圾收集、JIT編譯等運行引數,命令格式為:
jstat [ option vmid [ interval [ s | ms ] [ count ] ] ]
對于其中的vmid,如果是本地虛擬機行程,那么vmid就是lvmid,如果是遠程虛擬機行程,那么vmid的格式為:
[ protocol : ] [//] lvmid [ @hostname [ : port ] /servername ]
interval和count表示查詢間隔和次數,如果省略這兩個引數,說明只查詢一次,比如,jstat -gc 2764 250 20,表示:每隔250毫秒查詢一次行程2764的GC狀況,一共查詢20次,
option代表用戶希望查詢的虛擬機資訊,主要分為3類:類加載、垃圾收集、運行期編譯狀況,
| 選項 | 作用 |
| -class | 監視類加載、卸載數量、總空間以及類裝載所耗費的時間 |
| -gc | 監視Java堆狀況,包括Eden、Survivor、老年代、永久代等的容量、已用空間、GC時間合計等資訊 |
| -gccapacity | 監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間 |
| -gcutil | 監視內容與-gc基本相同,但輸出主要關注已使用空間占總空間的百分比 |
| -gccause | 與-gcutil功能一樣,但會額外輸出導致上次一次GC的原因 |
| -gcnew | 監視新生代GC狀況 |
| -gcnewcapacity | 監視內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間 |
| -gcold | 監視老年代GC狀況 |
| -gcoldcapacity | 監視內容與-gcold基本相同,輸出主要關注使用到的最大、最小空間 |
| -gcpermcapacity | 監視永久代使用到的最大、最小空間 |
| -compiler | 輸出JIT編譯器編譯過的方法、耗時等資訊 |
| -printcompilation | 輸出已經被JIT編譯的方法 |
1.3 jinfo:Java配置資訊工具
實時地查看和調整虛擬機各項引數,jinfo -flag可以查詢虛擬機未被顯示指定的引數的系統默認值,在JDK1.6之后,jinfo可以使用-flag[+|-] name或者-flag name=value修改一部分運行期可寫的虛擬機引數值,jinfo不少功能在Windows下都是受限的,命令格式為:jinfo [ option ] pid
1.4 jmap:Java記憶體映像工具
用于生成堆轉儲快照(一般稱為heapdump或dump檔案),除此之外還可以查詢finalize執行佇列、Java堆和永久代的詳細資訊,如空間使用率、當前使用的是哪種收集器等,和jinfo一樣,jmap有不少功能在Windows平臺下都是受限的,除了生成dump檔案的-dump選項和用于查看每個類的實體、空間占用統計的-histo選項在所有作業系統都提供之外,其余選項都只能在Linux/Solaris下使用,命令格式為:jmap [ option ] vmid
| 選項 | 作用 |
| -dump | 生成Java堆轉儲快照,格式為:-dump:[live, ]format=b,file=<filename>,其中live子引數說明是否只dump出存活的物件 |
| -finalizerinfo | 顯示在F-Queue中等待Finalizer執行緒執行finalize方法的物件,只在Linux/Solaris平臺下有效 |
| -heap | 顯示Java堆詳細資訊,如使用哪種回收器、引數配置、分代狀況等,只在Linux/Solaris平臺下有效 |
| -histo | 顯示堆中物件統計資訊,包括類、實體數量、合計容量 |
| -permstat | 已ClassLoader為統計口徑顯示永久代記憶體狀態,只在Linux/Solaris平臺下有效 |
| -F | 當虛擬機行程堆-dump選項沒有回應時,可使用這個選項強制生成udmp快照,只在Linux/Solaris平臺下有效 |
1.5 jhat:虛擬機堆轉儲快照分析工具
與jmap搭配使用,來分析jmap生成的堆轉儲快照,jhat內置了一個HTTP/HTML服務器,生成dump檔案的分析結果后,可以在瀏覽器中查看,但是jhat很少使用,因為有更好的分析工具,
1.6 jstack:Java堆疊跟蹤工具
用于生成虛擬機當前時刻的執行緒快照(一般稱為threaddump或者javacore檔案),執行緒快照是當前虛擬機內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒長時間停頓的原因,如死鎖、死回圈、請求外部資源導致的長時間等待等都是導致執行緒長時間停頓的常見原因,通過jstack查看各個執行緒的呼叫堆疊,可以直到執行緒到底在后臺做什么事,或等待什么資源,
| 選項 | 作用 |
| -F | 正常輸出的請求不被回應時,強制輸出執行緒堆疊 |
| -l | 除堆疊外,顯示關于鎖的附加資訊 |
| -m | 如果呼叫到本地方法的話,可以顯示C/C++的堆疊 |
在JDK1.5中,java.lang.Thread類新增了一個getAllStackTraces()方法用于獲取虛擬機中所有執行緒的StackTrackElement物件,使用這個方法可以通過簡單的幾行代碼就完成jstack的大部分功能,在實際專案中可以呼叫這個方法做一個管理頁面,就可以隨時使用瀏覽器來查看執行緒堆疊,
1.7 HSDIS:JIT生成代碼反匯編
之前寫過一個相關博文,見JIT生成代碼反匯編(HSDIS),
二、JDK可視化工具
2.1 JConsole
JConsole(Java Monitoring and Management Console)是一種基于JMX的可視化監視、管理工具,它管理部分的功能是針對JMX MBean進行管理,它可以連接本地虛擬機行程,也可以連接遠程行程,基本包括以下基本功能:概述、記憶體、執行緒、類、VM概要、MBean,其相當于將jstat、jstack等指令可視化后集成到了一起,
2.2 VisualVM
除了運行監視、故障處理外,還提供了很多其他方面的功能,如性能分析,同時,VisualVM不需要被監視的程式基于特殊Agent運行,因此它對應用程式的實際性能影響很小,使得它可以直接應用在生產環境中,其基于NetBeans平臺開發,具備插件擴展功能的特性,通過插件擴展支持,VisualVM可以做到集成眾多JDK命令列工具:
- 顯示虛擬機行程以及行程的配置、環境資訊(jps、jinfo)
- 監視應用程式的CPU、GC、堆、方法區以及執行緒的資訊(jstat、jstack)
- dump以及分析堆轉儲快照(jmap、jhat)
- 方法級的程式運行性能分析,找出被呼叫最多、運行時間最長的方法
- 離執行緒式快照
- 其他可能
三、總結
本章介紹了隨JDK發布的6個命令列工具和兩個可視化故障處理工具,除了JDK自帶的工具之外,常用的故障處理工具還有很多,比如IBM的Heap Analyzer、Eclipse的MAT等等,對于工具的使用不能紙上談兵,要在具體環境中進行實操,才能更快的掌握,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263016.html
標籤:其他
上一篇:Linux下洗掉過期日志檔案
