JDK 监控和故障处理工具总结
文章目錄
- JDK 命令行工具
 - jps:查看所有 Java 進程
 - jstat: 監視虛擬機各種運行狀態信息
 - jinfo: 實時地查看和調整虛擬機各項參數
 - jmap:生成堆轉儲快照
 - jhat: 分析 heapdump 文件
 - jstack :生成虛擬機當前時刻的線程快照
 
寫在前面:
 我是「境里婆娑」。我還是從前那個少年,沒有一絲絲改變,時間只不過是考驗,種在心中信念絲毫未減,眼前這個少年,還是最初那張臉,面前再多艱險不退卻。
 寫博客的目的就是分享給大家一起學習交流,如果您對 Java感興趣,可以關注我,我們一起學習
JDK 命令行工具
這些命令在 JDK 安裝目錄下的 bin 目錄下:
- jps (JVM Process Status): 類似 UNIX 的 ps 命令。用戶查看所有 Java 進程的啟動類、傳入參數和 Java 虛擬機參數等信息;
 - jstat( JVM Statistics Monitoring Tool): 用于收集 HotSpot 虛擬機各方面的運行數據;
 - jinfo (Configuration Info for Java) : Configuration Info forJava,顯示虛擬機配置信息;
 - jmap (Memory Map for Java) :生成堆轉儲快照;
 - jhat (JVM Heap Dump Browser ) : 用于分析 heapdump 文件,它會建立一個 HTTP/HTML 服務器,讓用戶可以在瀏覽器上查看分析結果;
 - jstack (Stack Trace for Java):生成虛擬機當前時刻的線程快照,線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合。
 
jps:查看所有 Java 進程
jps(JVM Process Status) 命令類似 UNIX 的 ps 命令。
jps:顯示虛擬機執行主類名稱以及這些進程的本地虛擬機唯一 ID(Local Virtual Machine Identifier,LVMID)。jps -q :只輸出進程的本地虛擬機唯一 ID。
C:\Users\Administrator>jps 10496 12976 SpringBootBasicConfigurationApplication 1432 Launcher 8984 12348 KotlinCompileDaemon 12764 Jps 13276 RemoteMavenServerjps -l:輸出主類的全名,如果進程執行的是 Jar 包,輸出 Jar 路徑。
C:\Users\Administrator>jps -l 10496 12976 com.sl.SpringBootBasicConfigurationApplication 1432 org.jetbrains.jps.cmdline.Launcher 8984 12348 org.jetbrains.kotlin.daemon.KotlinCompileDaemon 13276 org.jetbrains.idea.maven.server.RemoteMavenServer 4108 sun.tools.jps.Jpsjps -v:輸出虛擬機進程啟動時 JVM 參數。
jps -m:輸出傳遞給 Java 進程 main() 函數的參數。
jstat: 監視虛擬機各種運行狀態信息
jstat(JVM Statistics Monitoring Tool) 使用于監視虛擬機各種運行狀態信息的命令行工具。 它可以顯示本地或者遠程(需要遠程主機提供 RMI 支持)虛擬機進程中的類信息、內存、垃圾收集、JIT 編譯等運行數據,在沒有 GUI,只提供了純文本控制臺環境的服務器上,它將是運行期間定位虛擬機性能問題的首選工具。
jstat 命令使用格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]比如 jstat -gc -h3 31736 1000 10表示分析進程 id 為 31736 的 gc 情況,每隔 1000ms 打印一次記錄,打印 10 次停止,每 3 行后打印指標頭部。
常見的 option 如下:
- jstat -class vmid :顯示 ClassLoader 的相關信息;
 - jstat -compiler vmid :顯示 JIT 編譯的相關信息;
 - jstat -gc vmid :顯示與 GC 相關的堆信息;
 - jstat -gccapacity vmid :顯示各個代的容量及使用情況;
 - jstat -gcnew vmid :顯示新生代信息;
 - jstat -gcnewcapcacity vmid :顯示新生代大小與使用情況;
 - jstat -gcold vmid :顯示老年代和永久代的行為統計,從jdk1.8開始,該選項僅表示老年代,因為永久代被移除了;
 - jstat -gcoldcapacity vmid :顯示老年代的大小;
 - jstat -gcpermcapacity vmid :顯示永久代大小,從jdk1.8開始,該選項不存在了,因為永久代被移除了;
 - jstat -gcutil vmid :顯示垃圾收集信息;
另外,加上 -t參數可以在輸出信息上加一個 Timestamp 列,顯示程序的運行時間。 
jinfo: 實時地查看和調整虛擬機各項參數
jinfo vmid :輸出當前 jvm 進程的全部參數和系統屬性 (第一部分是系統的屬性,第二部分是 JVM 的參數)。
jinfo -flag name vmid :輸出對應名稱的參數的具體值。比如輸出 MaxHeapSize、查看當前 jvm 進程是否開啟打印 GC 日志 ( -XX:PrintGCDetails :詳細 GC 日志模式,這兩個都是默認關閉的)。
C:\Users\Administrator>jinfo -flag MaxHeapSize 12976 -XX:MaxHeapSize=2067791872C:\Users\Administrator>jinfo -flag PrintGC 12976 -XX:-PrintGC使用 jinfo 可以在不重啟虛擬機的情況下,可以動態的修改 jvm 的參數。尤其在線上的環境特別有用,請看下面的例子:
jinfo -flag [+|-]name vmid 開啟或者關閉對應名稱的參數。
C:\Users\Administrator>jinfo -flag +PrintGC 12976C:\Users\Administrator>jinfo -flag PrintGC 12976 -XX:-PrintGCjmap:生成堆轉儲快照
jmap(Memory Map for Java)命令用于生成堆轉儲快照。 如果不使用 jmap 命令,要想獲取 Java 堆轉儲,可以使用 “-XX:+HeapDumpOnOutOfMemoryError” 參數,可以讓虛擬機在 OOM 異常出現之后自動生成 dump 文件,Linux 命令下可以通過 kill -3 發送進程退出信號也能拿到 dump 文件。
jmap 的作用并不僅僅是為了獲取 dump 文件,它還可以查詢 finalizer 執行隊列、Java 堆和永久代的詳細信息,如空間使用率、當前使用的是哪種收集器等。和jinfo一樣,jmap有不少功能在 Windows 平臺下也是受限制的。
示例:將指定應用程序的堆快照輸出到桌面。后面,可以通過 jhat、Visual VM 等工具分析該堆文件。
C:\Users\Administrator>jmap -dump:format=b,file=C:\Users\Administrator\Desktop\heap.hprof 12976 Dumping heap to C:\Users\Administrator\Desktop\heap.hprof ... Heap dump file createdjhat: 分析 heapdump 文件
jhat 用于分析 heapdump 文件,它會建立一個 HTTP/HTML 服務器,讓用戶可以在瀏覽器上查看分析結果。
C:\Users\Administrator>jhat C:\Users\Administrator\Desktop\heap.hprof Reading from C:\Users\Administrator\Desktop\heap.hprof... Dump file created Sat Mar 20 10:46:30 CST 2021 Snapshot read, resolving... Resolving 546760 objects... Chasing references, expect 109 dots............................................................................................................. Eliminating duplicate references............................................................................................................. Snapshot resolved. Started HTTP server on port 7000 Server is ready.訪問 http://localhost:7000/
jstack :生成虛擬機當前時刻的線程快照
jstack(Stack Trace for Java)命令用于生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合.
生成線程快照的目的主要是定位線程長時間出現停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的原因。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做些什么事情,或者在等待些什么資源。
 使用說明:
 jstack 9256
總結
以上是生活随笔為你收集整理的JDK 监控和故障处理工具总结的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Spring注解@Import详细使用说
 - 下一篇: SpringBoot中Profile配置