深入理解虛擬機器之虛擬機器效能監控和故障處理工具

SnailClimb發表於2019-02-28

《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第二版》讀書筆記與常見面試題總結

本節常見面試題(推薦帶著問題閱讀,問題答案在文中都有提到):

JVM調優的常見命令列工具有哪些?

1 概述

給一個系統定位問題的時候,知識、經驗是關鍵基礎,資料是依據,工具是運用知識處理資料的手段。經常 使用適當的虛擬機器監控和分析工具可以加速我們分析資料、定位解決問題的速度,但在學習工具前,也應當意識到工具永遠都是知識技能的一層包裝,並沒有什麼工具是“祕密武器”,不可能學會了就能包治百病。

2 JDK命令列工具(JDK安裝的bin目錄下):

下面這些命令列工具java.exe以及javac.exe我們都很熟悉了,下面我們主要看看其他命令列工具的作用。

JDK命令列工具

JDK監控和故障處理工具

  • jps:JVM Process Status Tool ,顯示指定系統內所有的HotSpot虛擬機器程式
  • jstat: JVM Statistics Monitoring Tool ,用於收集HotSpot虛擬機器各方面的執行資料。
  • jinfo: Configuration Info forJava,顯示虛擬機器配置資訊
  • jmap: Memory Map for Java,生成虛擬機器的記憶體轉儲快照(heapdump檔案)
  • jhat: JVM Heap Dump Browser ,用於分析heapdump檔案,它會建立一個HTTP/HTML伺服器,讓使用者可以在瀏覽器上檢視分析結果
  • jstack: Stack Trace forJava,顯示虛擬機器的執行緒快照

2.1 jps:虛擬機器程式狀況工具

JDK的很多小工具的名字都參考了UNIX命令的命名方式,jps(JVM Process Status) 是其中的典型。除了名字像UNIX的ps命令外,它的功能也和ps命令類似:可以列出正在執行的虛擬機器程式,並顯示虛擬機器執行主類名稱以及這些程式的本地虛擬機器唯一ID(Local Virtual Machine Identifier,LVMID)。雖然功能比較單一,但它是使用最高的JDK命令列工具,因為其他的JDK工具大多需要輸入它查詢到的LVMID來確定要監控的是哪一個虛擬機器程式。

jps的常用功能選項:

jps的常用功能選項

測試:

測試

上面輸出了我正在執行程式的包名下的類名:

上面輸出了我正在執行程式的包名下的類名

2.2 jstat:虛擬機器統計資訊監視工具

jstat(JVM Statistics Monitoring Tool) 使用於監視虛擬機器各種執行狀態資訊的命令列工具。 它可以顯示本地或者遠端(需要遠端主機提供RMI支援)虛擬機器程式中的類資訊、記憶體、垃圾收集、JIT編譯等執行資料,在沒有GUI,只提供了純文字控制檯環境的伺服器上,它將是執行期間定位虛擬機器效能問題的首選工具。

jstat主要工具選項:

jstat主要工具選項

測試:

測試

2.3 jinfo:Java配置資訊工具

jinfo(Configuration Info for Java) 的作用是實時地檢視和調整虛擬機器各項引數。 使用jps命令的-v可以檢視虛擬機器啟動時顯式指定的引數列表,但如果想知道未被顯式指定的引數的系統預設值,可以使用jinfo的-flag選項進行查詢,jinfo還可以使用-sysprops選項把虛擬機器程式的System.getProperties()的內容列印出來。

測試:

測試

2.4 jmap:Java記憶體映像工具

jmap(Memory Map for Java)命令用於生成堆轉儲快照。 如果不使用jmap命令,要想獲取Java堆轉儲,可以使用“-XX:+HeapDumpOnOutOfMemoryError”引數,可以讓虛擬機器在OOM異常出現之後自動生成dump檔案,Linux命令下可以通過kill -3傳送程式退出訊號也能拿到dump檔案。

jmap的作用並不僅僅是為了獲取dump檔案,它還可以查詢finalize執行佇列、Java堆和永久代的詳細資訊,如空間使用率、當前使用的是哪種收集器等。和jinfo一樣,jmap有不少功能在Windows平臺下也是受限制的,除了生成dump檔案的-dump選項和用於檢視每個類的例項、空間佔用統計的-histo選項在所有作業系統都提供之外,其餘選項都只能在Linux和Solaris系統下使用。

2.5 jstack:Java堆疊跟蹤工具

jstack(Stack Trace for Java)命令用於生成虛擬機器當前時刻的執行緒快照。執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合.

生成執行緒快照的目的主要是定位執行緒長時間出現停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等都是導致執行緒長時間停頓的原因。執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做些什麼事情,或者在等待些什麼資源。**

3 JDK視覺化工具:

JConsole和VisualVM是兩個功能強大的視覺化工具。

從Java 5開始 引入了 JConsole,JConsole 是一個內建 Java 效能分析器。您可以輕鬆地使用 JConsole(或者,它更高階的 “近親” jvisualvm )來監控 Java 應用程式效能和跟蹤 Java 中的程式碼。(推薦使用升級版 JConsole 即 jvisualvm 。)

控制檯啟動或者直接雙擊可執行程式。

控制檯啟動或者直接雙擊可執行程式

如下圖所示(這裡就不具體介紹某一點了):

jconsole

我們再來看看jvisualvm

位置
主介面
簡單使用

歡迎關注我的微信公眾號:”Java面試通關手冊”(一個有溫度的微信公眾號,期待與你共同進步~~~堅持原創,分享美文,分享各種Java學習資源):

微信公眾號

相關文章