Java 程序該怎麼優化?命令篇

靈魂拷問,JDK 提供的命令,除了 java、javac,你還用過哪些命令呢?


靈魂再拷問,若你寫的 Java 程序,出現了性能問題,該怎麼去排查呢?


Java 作為編程語言中的戰鬥機,JDK 默認已經為我們提供了很多排查問題的工具,接下來就逐一認識認識。


1. jps


jps 命令,可以列出系統中所有運行 Java 進程,並可以查看 Java 進程的啟動類、傳入參數以及 JVM 參數等信息。


例如,在控制檯輸入 jps -lmv 命令,效果如下(截取部分內容)。


Java 程序該怎麼優化?命令篇


很顯然,jps 背後是一個 Java 程序,列出了完整的類路徑、傳給 main 方法的參數,以及 JVM 的參數。


為了方便了解、查閱,對 jps 命令的參數進行大致的梳理。


Java 程序該怎麼優化?命令篇


另外,不要大驚小怪,jps 以及下面要提到的 JDK 的排查工具,本質都是 Java 程序。


2. jstat


jstat 命令,用於查看 Java 進程的堆使用情況以及 GC 情況。


例如,輸出 Java 進程 90961 的類加載相關信息,每秒鐘統計一次信息,一共輸出 3 次。


控制檯輸入命令:jstat -class 90961 1000 3,效果如下。


Java 程序該怎麼優化?命令篇

Java 程序該怎麼優化?命令篇

例如,顯示 GC 相關的堆信息。


控制檯輸入命令:jstat -gc 90961,效果如下。


Java 程序該怎麼優化?命令篇

Java 程序該怎麼優化?命令篇


例如,顯示最近一次 GC 的原因及當前 GC 的原因。


控制檯輸入命令:jstat -gccause 90961,效果如下。


Java 程序該怎麼優化?命令篇

<code>參數含義解釋:
LGCC:上次 GC 的原因;
GCC:當前 GC 的原因。/<code>


另外,為了方便了解、查閱,對 jstat 命令的參數進行大致的梳理。


Java 程序該怎麼優化?命令篇


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 命令的參數也進行大致的梳理。


Java 程序該怎麼優化?命令篇


4. jmap


jmap 命令,可以幫我們生成 Java 進程的堆快照和對象的統計信息。


例如,生成 PID 為 90961 的 Java 進程的對象統計信息,並輸出到 yyxj.txt 文件中。


控制檯輸入命令:jmap -histo 90961 > yyxj.txt,打開文件效果如下。


Java 程序該怎麼優化?命令篇


例如,生成 PID 為 90961 的 Java 進程的當前堆快照,輸出到 heap.hprof 文件中。


命令:jmap -dump:format=b,file=heap.hprof 90961


對於輸出的 heap.hprof 快照文件,可以使用 jhat、VisualVM 等工具打開查看。採用 VisualVM 工具查看,效果如下。


Java 程序該怎麼優化?命令篇


5. jhat


jhat 命令,用於分析 Java 程序的堆快照內容,並且在分析完成之後,啟動一個 HTTP 服務,讓我們可以通過瀏覽器查看 Java 堆快照信息。


例如,採用 jhat 分析上一步中 jmap 輸出的堆快照文件。


輸入命令:jhat heap.hprof,效果如下。


Java 程序該怎麼優化?命令篇


瀏覽器訪問 http://127.0.0.1:7000,一探究竟。


Java 程序該怎麼優化?命令篇


另外,唯恐堆快照會比較大,jhat 還支持 OQL 語句查詢堆快照信息,閒暇之餘可參考幫助手冊 http://127.0.0.1:7000/oqlhelp/ 進行深入瞭解。


6. jstack


jstack 命令,可以幫助我們導出 Java 程序的線程堆棧,並自動幫我們進行死鎖檢查,並輸出找到的死鎖信息。


例如,把 PID 為 92760 的 Java 進程的線程堆棧信息,輸出保存到文件中。

命令:jstack -l 92760 > deadlock.txt,打開 deadlock.txt,進程的內部細節,一覽無餘,那麼我們很容易,就能找到死鎖。


Java 程序該怎麼優化?命令篇

Java 程序該怎麼優化?命令篇


7. 其它


本次提到的這些命令,建議有時間實操一遍,因為紙上得來終覺淺,絕知此事要躬行


JDK 提供的排查問題的命令還有很多,時間關係,本次就不再一一列舉。


後續會進行實戰分析,看看如何把這些命令組合起來,去打一套好的組合拳出來,敬請期待。


分享到:


相關文章: