性能測試必備監控技能jvm之jdk命令行工具篇16

3.png

前言

對于JVM的性能監控,主要注意以下關鍵參數,通過jdk自帶的命令行工具,即可查看相關參數,從而分析系統或目標服務程序中存在的性能瓶頸

jps

JVM Process Status Tool的縮寫,JVM進程狀況工具。

主要功能:
列出正在運行的java進程,并顯示執行主類的名稱及進程在本地JVM中的ID。

與ps命令相似,可以查看java進程ID(LVMID)。
使用方法:

jps [options][hostid]

[options]:
-q: 只輸出LVMID
-m: 輸出JVM啟動時傳給主類的方法
-l:輸出主類的全名,如果是Jar則輸出jar的路徑
-v: 輸出JVM啟動參數

jstat

JVM Statistics Monitoring Tool的縮寫,JVM統計信息監控工具。

主要功能:監控JVM各種運行狀態信息,如虛擬機進程中的類裝載、內存、GC、JIT編譯等數據。

使用方法:

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

 參數解釋:

Options — 選項,一般使用 -gcutil 查看gc情況

vmid    — VM的進程號,與LVMID一致,使用jps查看

interval– 間隔時間,單位為秒或者毫秒

count   — 打印次數,如果缺省則打印無數次

注:
1、本地JVM進程:與LVMID一致,使用jps查看
2、遠程JVM進程:[protocol:][//]LVMID[@hostname[:post]/servername]

遠程查看,需在目標服務上啟動jstatd服務。

下面我們看下options選項:

  • jstat -class vmid:顯示加載class的數量,及所占空間等信息。

  • jstat -compiler vmid:顯示VM實時編譯的數量等信息。

  • jstat -gc vmid:顯示gc的信息,查看gc的次數,及時間。其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。

  • jstat -gccapacity: 顯示VM內存中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。其他的可以根據這個類推, OC是old內純的占用量。

  • jstat -gcnew vmid:new對象的信息。

  • jstat -gcnewcapacity vmid:new對象的信息及其占用量。

  • jstat -gcold vmid:old對象的信息。

  • jstat -gcoldcapacity vmid:old對象的信息及其占用量。

  • jstat -gcpermcapacity vmid: perm對象的信息及其占用量。

  • jstat -util vmid:統計gc信息統計。

  • jstat -printcompilation vmid:當前VM執行的信息。

jmap

JVM Memory Map for Java的縮寫,Java內存映像工具。

主要功能:

  1. 用于生成堆轉儲快照,即dump文件

  2. 可以查詢finalize執行隊列、Java堆和永久代的詳細信息(使用率、當前用的GC等)

使用方法:

jmap [ option ] pid

pid 與LVMID一致,使用jps查看
  • dump: [live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件。 live子選項是可選的,如果指定live選項,那么只輸出活的對象到文件。

  • finalizerinfo 打印正等待回收的對象的信息。

  • heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況。

  • histo[:live] 打印每個class的實例數目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*”。 如果指定live,只統計活的對象數量。

  • permstat 打印classload和jvm heap長久層的信息。 包含每個classloader的名字、活動性、地址、父classloader和加載的class數量,內部String的數量和占用內存數也會打印出來。

  • F 強迫在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live參數無效。

  • h | -help 打印輔助信息

  • J 傳遞參數給jmap啟動的jvm.

注:使用jmap的時候JVM會處于假死狀態,所以只能在服務已死,但進程還在的情況下使用。

jstack

JVM Stack Trace for Java的縮寫,堆棧跟蹤工具。

主要功能:

  1. 用于生成JVM當前的線程快照(即當前JVM內每一個條線程正在執行的方法堆棧集合)
  2. 用于分析線程出現長時間停頓的原因

使用方法:

jstack [options] vmid

options:
-F 當正常輸出的請求不響應時,強制輸出線程堆棧(jstack [-l] pid無法響應時,強制打印堆棧)

-l 除堆棧信息外,顯示關于鎖的附加信息

-m
打印混合模式(Java和本地C/C++幀)的堆棧跟蹤信息。

-h
打印幫助信息。

-help
打印幫助信息。

jhat

用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,并支持對象查詢語言

java堆棧dump來源方式:
有以下幾種方式可以生成一個Java heap dump:

  • 使用jmap -dump選項獲取一個運行時的heap dump。
  • 使用jconsole選項通過運行時的HotSpotDiagnosticMXBean獲取一個heap dump。
  • 通過指定-XX:+HeapDumpOnOutOfMemoryErrorVM選項,在拋出OutOfMemoryError錯誤時,將會生成一個heap dump。
  • 使用hprof。

訪問 http://localhost:7000,就可以查看詳細的內存信息

有時dump出來的堆很大,在啟動時會報堆空間不足的錯誤,可以使用如下參數:
jhat -J-Xmx1024m <heap dump file>

總結

這些命令都在jdk的bin目錄里,是jdk自帶的一些監控分析工具,如果你在bin目錄下沒有找到對應的工具,說明該版本的jdk已經去除了該命令的支持。

在筆者日常性能測試診斷調優時,最常用的組合是jps和jstack,再加上第三方的分析工具。后續會介紹第三方的分析工具。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容