1. 程式人生 > >深入理解Java虛擬機器總結一虛擬機器效能監控工具與效能調優(三)

深入理解Java虛擬機器總結一虛擬機器效能監控工具與效能調優(三)

深入理解Java虛擬機器總結一虛擬機器效能監控工具與效能調優(三)

  • JDK的命令列工具
  • JDK的視覺化工具
  • 效能調優

JDK的命令列工具

主要有以下幾種:

  • jps (Java Process Status Tool): 虛擬機器程序狀態工具;
  • jstat (JVM Statistics Monitoring Tool): 虛擬機器統計資訊監視工具;
  • jinfo (Configuration Info for Java): Java配置資訊工具;
  • jmap (Memory Map for Java): Java記憶體映像工具;
  • jhat (JVM Heap Dump Browser): 虛擬機器堆轉儲存快照工具;
  • jstack (Stack Trace for Java): Java堆疊跟蹤工具;

下面一個個來總結:

jps : 虛擬機器程序狀態工具
  • jps(JVM Process Status Tool,虛擬機器程序監控工具),這個命令可以列出正在執行的虛擬機器程序,並顯示虛擬機器執行主類名稱,以及這些程序的本地虛擬機器唯一ID。
  • 這個 ID 被稱為本地虛擬機器唯一 ID(Local Virtual Machine Identifier,簡寫為LVMID)。如果你在 linux 的一臺伺服器上使用 jps 得到的 LVMID 其實就是和 ps 命令得到的 PID 是一樣的。

命令格式:

jps [options] [hostid]

jps工具主要選項:

  • -q,只輸出LVMID,省略主類的名稱;
  • -m,輸出虛擬機器程序啟動時傳給主類main()函式的引數;
  • -l,輸出主類的全名,如果程序執行的是Jar包,輸出Jar路徑;
  • -v,輸出虛擬機器程序啟動時JVM引數;
jstat : 虛擬機器統計資訊監視工具
  • jstat(JVM Statistics Monitoring Tool,虛擬機器統計資訊監視工具),這個命令用於監視虛擬機器各種執行狀態資訊。
  • 它可以顯示本地或者遠端虛擬機器程序中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料,雖然沒有GUI圖形介面,只是提供了純文字控制檯環境的伺服器上,但它是執行期間定位虛擬機器效能問題的首選工具。

命令格式:

jstat [option vmid [interval [s | ms] [count ] ] ]

option代表著使用者希望查詢的虛擬機器資訊,主要分為3類: 類裝載、垃圾收集、執行期編譯狀況,具體可以參照下表:
在這裡插入圖片描述
示例:
在這裡插入圖片描述

更多jstat的詳細講解可以參考這篇部落格

jinfo :Java配置資訊工具
  • 實時地檢視和調整虛擬機器各項引數。

檢視14838是否使用CMS收集器:

jinfo -flag UseConcMarkSweepGC 14836

檢視2788的MaxPerm大小可以用

jinfo -flag MaxPermSize 2788
jmap : Java記憶體映像工具
  • jmap(Memory Map for Java,記憶體映像工具),用於生成堆轉存的快照,一般是 heapdump 或者 dump 檔案。如果不使用 jmap 命令,可以使用 -XX:+HeapDumpOnOutOfMemoryError 引數,當虛擬機發生記憶體溢位的時候可以產生快照。或者使用kill -3 pid也可以產生。
  • jmap 的作用並不僅僅是為了獲取 dump 檔案,它可以查詢 finalize 執行佇列,java 堆和永久代的詳細資訊,如空間使用率,當前用的哪種收集器。

格式:

jmap [option] vmid

生成某個pid的儲存快照示例:
在這裡插入圖片描述
在這裡插入圖片描述

jhat : 虛擬機器堆轉儲存快照工具
  • jhat(虛擬機器堆轉儲快照分析工具),這個工具是用來分析 jmap dump 出來的檔案。 由於這個工具功能比較簡陋,執行起來也比較耗時,所以這個工具不推薦使用,推薦使用MAT。

分析示例:
在這裡插入圖片描述

jstack : Java堆疊跟蹤工具
  • jstack(Java Stack Trace,Java堆疊跟蹤工具),這個命令用於檢視虛擬機器當前時刻的執行緒快照(一般是threaddump 或者 javacore檔案)。執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合。
  • 生成執行緒快照的主要目的是:定位執行緒出現長時間停頓的原因,入執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待都是導致執行緒長時間停頓的常見原因。
  • 執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做些什麼事情。

命令格式:

jstack [option] vmid

使用:檢視程序8024 的堆疊資訊

jstack 8024

JDK的視覺化工具

  • Jconsole : Java監視與管理控制檯
  • VisualVM: 多合一故障處理工具

下面具體看這個兩個工具:

Jconsole : Java監視與管理控制檯
  • JConsole可以監視JVM 記憶體的使用情況、執行緒堆疊跟蹤、已裝入的類和 VM 資訊以及 CE MBean。
  • JConsole一個 Java GUI 監視工具,可以以圖表化的形式顯示各種資料。並可通過遠端連線監視遠端的伺服器VM。
  • 用 Java 寫的 GUI 程式,用來監控 VM,並可監控遠端的 VM,非常易用,而且功能非常強。命令列裡打 Jconsole,選則程序就可以了。
  • 可以監控記憶體和執行緒,以及檢測是否出現死鎖;
VisualVM :多合一故障處理工具
  • VisualVm 同 Jconsole 都是一個基於圖形化介面的、可以檢視本地及遠端的 JAVA GUI 監控工具,VisualVm 同 Jconsole 的使用方式一樣,直接在命令列打入JVisualVm 即可啟動,VisualVm 介面更美觀一些,資料更實時。

效能調優

效能調優:

  • 知識
  • 工具
  • 資料
  • 經驗

關於效能調優更多的可以看看這篇JVM效能調優案例