Java虛擬機8:虛擬機性能監(jiān)控與故障處理工具
時間:2023-06-28 02:51:01 | 來源:網(wǎng)站運營
時間:2023-06-28 02:51:01 來源:網(wǎng)站運營
Java虛擬機8:虛擬機性能監(jiān)控與故障處理工具:
前言定位系統(tǒng)問題的時候,知識、經(jīng)驗是基礎,數(shù)據(jù)是依據(jù),工具是運用知識處理數(shù)據(jù)的手段。這里說的數(shù)據(jù)包括:運行日志、異常堆棧、GC日志、線程快照、堆轉儲快照等。經(jīng)常使用適當?shù)奶摂M機監(jiān)控和分析的工具可以加快分析數(shù)據(jù)、定位解決問題的速度。
jps:虛擬機進程狀況工具首先約定一下運行的代碼都是以下這段
1 public class TestMain
2 {
3 public static void main(String[] args)
4 {
5 while (true)
6 {
7
8 }
9 }
10 }
JDK的很多小工具的名字都參考了UNIX命令的命名方式,jps(JVM Process Status)是其中的典型。除了名字像UNIX的ps命令外,它的功能也和ps命令類似:可以列出正在運行的虛擬機進程,并顯示虛擬機執(zhí)行主類名稱以及這些進程的本地虛擬機唯一ID(Local Virtual Machine Identifier,LVMID)。雖然功能比較單一,但它是使用最高的JDK命令行工具,因為其他的JDK工具大多需要輸入它查詢到的LVMID來確定要監(jiān)控的是哪一個虛擬機進程。
jps命令格式:jps [ options ] [ hostid ]
jps工具主要選項jps執(zhí)行樣例某個虛擬機進程執(zhí)行TestMain這個類的main方法,看到10492就是該虛擬機進程的ID
jstat:虛擬機統(tǒng)計信息監(jiān)控工具jstat(JVM Statistics Monitoring Tool)使用于監(jiān)視虛擬機各種運行狀態(tài)信息的命令行工具。它可以顯示本地或者遠程(需要遠程主機提供RMI支持)虛擬機進程中的類信息、內存、垃圾收集、JIT編譯等運行數(shù)據(jù),在沒有GUI,只提供了純文本控制臺環(huán)境的服務器上,它將是運行期間定位虛擬機性能問題的首選工具。
jstat命令格式jstat [ option vmid [ interval [ s | ms ] [ count ] ] ]
這個VMID,對于本地虛擬機進程而言,VMID和LVMID是一致的。參數(shù)interval和count分別表示查詢間隔和次數(shù),如果省略這兩個參數(shù),說明只查詢一次,假設需要每250毫秒查詢一次進程2764的垃圾收集情況,一共查詢20次,那命令應當是:
jstat -gc 2764 250 20jstat主要工具選項jstat執(zhí)行樣例jstat監(jiān)視選項眾多,舉一個例子來查看一下該命令如何查看監(jiān)視結果
查詢結果表明,新生代Eden區(qū)(E,表示Eden)使用了2%的空間,兩個Survivor區(qū)(S0、S1,表示Survivor0、Survivor1)都是空的,老年代(O,表示Old)和永久帶(P。表示Permanent)則分別使用了0%和13.84%的空間。程序運行以來共發(fā)生Minor GC(YGC,表示Young GC)0次,總共耗時0秒;發(fā)生Full GC(FGC,表示Full GC)3次,F(xiàn)ull GC共耗時(FGCT,F(xiàn)ull GC Time)為0秒,所有GC總耗時(GCT,表示GC Time)0秒。
jinfo:Java配置信息工具jinfo(Configuration Info for Java)的作用是實時地查看和調整虛擬機各項參數(shù)。使用jps命令的-v可以查看虛擬機啟動時顯式指定的參數(shù)列表,但如果想知道未被顯式指定的參數(shù)的系統(tǒng)默認值,可以使用jinfo的-flag選項進行查詢,jinfo還可以使用-sysprops選項把虛擬機進程的System.getProperties()的內容打印出來。
jinfo命令格式jinfo [ option ] pid
jinfo執(zhí)行樣例jinfo這個命令對于Windows平臺有較大限制,在Linux和Solaris系統(tǒng)才可以正常使用,所以這里就不演示了。
jmap:Java內存映像工具jmap(Memory Map for Java)命令用于生成堆轉儲快照。如果不使用jmap命令,要想獲取Java堆轉儲,可以使用“-XX:+HeapDumpOnOutOfMemoryError”參數(shù),可以讓虛擬機在OOM異常出現(xiàn)之后自動生成dump文件,Linux命令下可以通過kill -3發(fā)送進程退出信號也能拿到dump文件。
jmap的作用并不僅僅是為了獲取dump文件,它還可以查詢finalize執(zhí)行隊列、Java堆和永久代的詳細信息,如空間使用率、當前使用的是哪種收集器等。和jinfo一樣,jmap有不少功能在Windows平臺下也是受限制的,除了生成dump文件的-dump選項和用于查看每個類的實例、空間占用統(tǒng)計的-histo選項在所有操作系統(tǒng)都提供之外,其余選項都只能在Linux和Solaris系統(tǒng)下使用。
jmap命令格式jmap [ option ] vmid
jmap工具主要選項jmap執(zhí)行樣例同樣,這個命令對Window環(huán)境限制也比較大,就不演示了。
jstack:Java堆棧跟蹤工具jstack(Stack Trace for Java)命令用于生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的目的主要是定位線程長時間出現(xiàn)停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源導致的長時間等待等都是導致線程長時間停頓的原因。線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做些什么事情,或者在等待些什么資源。
jstack命令格式jstack [ option ] vmid
jstack主要工具選項jstack執(zhí)行樣例只截取一部分,看到這就是10492這個虛擬機進程ID當前時刻的線程快照。線程處于RUNNABLE狀態(tài),執(zhí)行到了TestMain函數(shù)的第7行,并且一直停留在第7行。
其他上面都是利用命令采集指定進程的虛擬機運行時的信息,實際上,還可以利用可視化工具對指定PID的虛擬機運行時信息進行監(jiān)控,這里推薦兩個:
1、JConsole
在Java_HOME/bin目錄下,有一個jconsole.exe,雙擊運行一下就可以了。
2、Visual VM
這個是到目前為止隨JDK發(fā)布的功能最為強大的運行監(jiān)視和故障處理工具,除了最基本的運行監(jiān)視、 故障處理外,還有性能分析的功能,且十分強大。Visual VM還有一個很大的優(yōu)點,它對應用程序的實際性能影響很小,使得它可以直接應用在生產(chǎn)環(huán)境中。
至于具體如何使用,就不演示了,比較簡單。除了上面兩個工具,還可以使用JProfiler、YourKit等專業(yè)且收費的Profiling工具。