靈魂拷問,JDK 提供的命令,除了 java、javac,你還用過哪些命令呢?
靈魂再拷問,若你寫的 Java 程序,出現了性能問題,該怎麼去排查呢?
Java 作為編程語言中的戰鬥機,JDK 默認已經為我們提供了很多排查問題的工具,接下來就逐一認識認識。
1. jps
jps 命令,可以列出系統中所有運行 Java 進程,並可以查看 Java 進程的啟動類、傳入參數以及 JVM 參數等信息。
例如,在控制檯輸入 jps -lmv 命令,效果如下(截取部分內容)。
![Java 程序該怎麼優化?命令篇](http://p2.ttnews.xyz/loading.gif)
很顯然,jps 背後是一個 Java 程序,列出了完整的類路徑、傳給 main 方法的參數,以及 JVM 的參數。
為了方便了解、查閱,對 jps 命令的參數進行大致的梳理。
![Java 程序該怎麼優化?命令篇](http://p2.ttnews.xyz/loading.gif)
另外,不要大驚小怪,jps 以及下面要提到的 JDK 的排查工具,本質都是 Java 程序。
2. jstat
jstat 命令,用於查看 Java 進程的堆使用情況以及 GC 情況。
例如,輸出 Java 進程 90961 的類加載相關信息,每秒鐘統計一次信息,一共輸出 3 次。
控制檯輸入命令:jstat -class 90961 1000 3,效果如下。
例如,顯示 GC 相關的堆信息。
控制檯輸入命令:jstat -gc 90961,效果如下。
例如,顯示最近一次 GC 的原因及當前 GC 的原因。
控制檯輸入命令:jstat -gccause 90961,效果如下。
<code>參數含義解釋:
LGCC:上次 GC 的原因;
GCC:當前 GC 的原因。/<code>
另外,為了方便了解、查閱,對 jstat 命令的參數進行大致的梳理。
3. jinfo
jinfo 命令,可以幫我們查看正在運行的 Java 進程的擴展參數,並支持在運行時修改部分參數;可以很方便地幫我們找到 JVM 參數的當前值。
例如,查看 Java 進程 90961 是否開啟打印 GC 詳細信息。
命令:jinfo -flag PrintGCDetails 90961
例如,打開 Java 進程 90961 的 PrintGCDetails 開關。
命令:jinfo -flag +PrintGCDetails 90961
例如,關閉 Java 進程 90961 的 PrintGCDetails 開關。
命令:jinfo -flag -PrintGCDetails 90961
使用比較簡單,就不貼效果啦。
另外,為了方便了解、查閱,對 jinfo 命令的參數也進行大致的梳理。
4. jmap
jmap 命令,可以幫我們生成 Java 進程的堆快照和對象的統計信息。
例如,生成 PID 為 90961 的 Java 進程的對象統計信息,並輸出到 yyxj.txt 文件中。
控制檯輸入命令:jmap -histo 90961 > yyxj.txt,打開文件效果如下。
例如,生成 PID 為 90961 的 Java 進程的當前堆快照,輸出到 heap.hprof 文件中。
命令:jmap -dump:format=b,file=heap.hprof 90961
對於輸出的 heap.hprof 快照文件,可以使用 jhat、VisualVM 等工具打開查看。採用 VisualVM 工具查看,效果如下。
5. jhat
jhat 命令,用於分析 Java 程序的堆快照內容,並且在分析完成之後,啟動一個 HTTP 服務,讓我們可以通過瀏覽器查看 Java 堆快照信息。
例如,採用 jhat 分析上一步中 jmap 輸出的堆快照文件。
輸入命令:jhat heap.hprof,效果如下。
瀏覽器訪問 http://127.0.0.1:7000,一探究竟。
另外,唯恐堆快照會比較大,jhat 還支持 OQL 語句查詢堆快照信息,閒暇之餘可參考幫助手冊 http://127.0.0.1:7000/oqlhelp/ 進行深入瞭解。
6. jstack
jstack 命令,可以幫助我們導出 Java 程序的線程堆棧,並自動幫我們進行死鎖檢查,並輸出找到的死鎖信息。
例如,把 PID 為 92760 的 Java 進程的線程堆棧信息,輸出保存到文件中。
命令:jstack -l 92760 > deadlock.txt,打開 deadlock.txt,進程的內部細節,一覽無餘,那麼我們很容易,就能找到死鎖。
7. 其它
本次提到的這些命令,建議有時間實操一遍,因為紙上得來終覺淺,絕知此事要躬行。
JDK 提供的排查問題的命令還有很多,時間關係,本次就不再一一列舉。
後續會進行實戰分析,看看如何把這些命令組合起來,去打一套好的組合拳出來,敬請期待。
閱讀更多 一猿小講 的文章