【JVM進階之路】八:性能監控工具-命令行篇

定位問題的時候,知識、經驗是關鍵基礎,數據是依據,工具是運用知識處理數據的手段。java

在實際的故障排查、性能監控中,經常是操做系統的工具和Java虛擬機的工具結合使用。ios

一、操做系統工具

1.一、top:顯示系統總體資源使用狀況

top命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用狀況。c++

在Linux使用top命令的部分輸出以下:web

top命令

top命令的輸出能夠分爲兩個部分:前半部分是系通通計信息,後半部分是進程信息。shell

在統計信息中:瀏覽器

  • 第1行是任務隊列信息,從左到右依次表示:系統當前時間、系統運行時間、當前登陸用戶,最後的load average表示系統的平均負載。
  • 第2行是進程統計信息,分別有正在運行的進程數、睡眠進程數、中止的進程數、殭屍進程數。
  • 第3行是CPU統計信息,us表示用戶空間CPU佔用率,sy表示內核空間CPU佔用率、ni表示用戶進程空間改變過優先級的進程cpu的佔用率、id表示空閒cpu佔用率、wa表示等待輸入輸出的CPU時間百分比、hi表示硬件中斷請求、si表示軟件中斷請求。

在進程信息區中,顯示了系統各個進程的資源使用狀況。主要字段的含義:緩存

  • PID:進程id
  • USER:進程全部者的用戶名
  • PR:優先級
  • NI:nice值,負值表示高優先級,正值表示低優先級
  • TIME+:進程使用的CPU時間總計,單位1/100秒
  • COMMAND:命令名/命令行

1.二、vmstat:監控內存和CPU

vmstat也是一款功能比較齊全的性能監測工具。它能夠統計CPU、內存使用狀況、swap使用狀況能信息。性能優化

通常vmstat工具的使用是經過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數,如:bash

vmstat命令

如下命令表示每秒採樣一次,共三次。服務器

輸出的各個列的含義:

分類 說明
Procs r: 運行隊列中進程數量
b: 等待IO的進程數量
Memory(內存) swpd: 使用虛擬內存大小
free: 可用內存大小
buff: 用做緩衝的內存大小
cache: 用做緩存的內存大小
Swap: si: 每秒從交換區寫到內存的大小
so: 每秒寫入交換區的內存大小
IO:(如今的Linux版本塊的大小爲1024bytes)
bi: 每秒讀取的塊數
bo: 每秒寫入的塊數
系統 in: 每秒中斷數,包括時鐘中斷
cs: 每秒上下文切換數
CPU(以百分比表示) us: 用戶進程執行時間(user time)
sy: 系統進程執行時間(system time)
id: 空閒時間(包括IO等待時間),中央處理器的空閒時間 ,以百分比表示。
wa: 等待IO時間

1.三、iostat:監控IO使用

iostat能夠提供磁盤IO的監控數據:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.44    0.00    0.39    0.00    0.00   98.17

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.37         0.47        30.30    3561197  229837730
dm-0              0.44         0.33        29.97    2518272  227313194
dm-1              0.12         0.13         0.33    1013276    2520308
dm-2              0.00         0.00         0.00        502       2068

以上命令顯示了CPU的使用概況和磁盤I/O的信息。

輸出結果各個列的含義:

iostat結果面板 avg-cpu 描述的是系統cpu使用狀況:

  • %user:CPU處在用戶模式下的時間百分比。
  • %nice:CPU處在帶NICE值的用戶模式下的時間百分比。
  • %system:CPU處在系統模式下的時間百分比。
  • %iowait:CPU等待輸入輸出完成時間的百分比。
  • %steal:管理程序維護另外一個虛擬處理器時,虛擬CPU的無心識等待時間百分比。
  • %idle:CPU空閒時間百分比。

1.四、netstat:監控網絡使用

在web程序中,可能運行須要網絡,可使用netstat命令監控網絡流量。

netstat -a
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:30037         *:*                     LISTEN
 udp        0      0 *:bootpc                *:*
 
Active UNIX domain sockets (servers and established)
 Proto RefCnt Flags       Type       State         I-Node   Path
 unix  2      [ ACC ]     STREAM     LISTENING     6135     /tmp/.X11-unix/X0
 unix  2      [ ACC ]     STREAM     LISTENING     5140     /var/run/acpid.socket
 ...

以上命令表示列出全部端口信息。

二、JDK性能監控工具

除了咱們比較熟悉的java.exe、javac.exe這兩個命令行工具,在jdk的bin目錄下,還有一些其它的工具。。除了編譯和運行Java程序外,打包、部署、簽名、調試、監控、運維等各類場景均可能會用到它們。

jdk命令行工具

2.一、jps:虛擬機進程查看

jps相似Linux下的ps,它會列出Java程序的進程。

jps命令格式:

jps [ options ] [ hostid ]

jps命令示例:

jps

jps的經常使用選項見表:

選項列表 描述
-q 只輸出進程 ID,忽略主類信息
-l 輸出主類全名,或者執行 JAR 包則輸出路徑
-m 輸出虛擬機進程啓動時傳遞給主類 main()函數的參數
-v 輸出虛擬機進程啓動時的 JVM 參數

2.二、jstat:虛擬機運行時信息查看

jsta是一個強大的工具。它能夠顯示本地或者遠程虛擬機進程中的類加載、內存、垃圾收集、即時編譯等運行時數據。

jstat命令格式爲:

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

選項option表明用戶但願查詢的虛擬機信息,主要分爲三類:類加載、垃圾收集、運行期編譯情況。

以下,輸出Java進程5728的ClassLoader相關信息,每秒統計一次信息,一共輸出兩次。

jsta示例

下例展現了與GC相關的堆信息的輸出:

jstat GC堆

jstat工具主要選項:

選項列表 描述
-class 監視類加載、卸載數量、總空間以及類裝載所耗費時長
-gc 監視 Java 堆狀況,包括 Eden 區、2 個 Survivor 區、老年代、永久代或者 jdk1.8 元空間等,容量、已用空間、垃圾收集時間合計等信息
-gccapacity 監視內容與-gc 基本一致,但輸出主要關注 Java 堆各個區域使用到的最大、最小空間
-gcutil 監視內容與-gc 基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause 與 -gcutil 功能同樣,可是會額外輸出致使上一次垃圾收集產生的緣由
-gcnew 監視新生代垃圾收集狀況
-gcnewcapacity 監視內容與 -gcnew 基本相同,輸出主要關注使用到的最大、最小空間
-gcold 監視老年代垃圾收集狀況
-gcoldcapacity 監視內容與 -gcold 基本相同,輸出主要關注使用到的最大、最小空間
-compiler 輸出即時編譯器編譯過的方法、耗時等信息
-printcompilation 輸出已經被即時編譯的方法

2.三、jinfo:虛擬機配置查看

jinfo的做用是實時查看和調整虛擬機各項參數。

jinfo命令格式:

jinfo [ option ] pid

下例顯示了新生愛對象晉升老年代的最大年齡。在應用程序啓動時,沒有指定,但經過jinfo,查看該參數的當前數值。

jinfo查看新生代晉升年齡

查看是否打印GC詳細信息:

查看是否打印GC詳細信息

2.四、jmap:內存映像(導出)

jmap命令用於生成堆轉儲快照(通常稱爲heapdump或dump文件)

jmap的做用並不只僅是爲了獲取堆轉儲快照,它還能夠查詢finalize執行隊列、Java堆和方法區的詳細信息,如空間使用率、當前用的是哪一種收集器等。

jmap命令格式:

jmap [ option ] vmid

以下,使用jmap生成PID爲5728的Java程序的對象統計信息, 並輸出到dump.txt中。

jmap

dump.txt的結構以下:

dump.txt

jmap更重要的功能是獲得Java程序的當前堆快照:

jmap轉儲堆快照

如圖,將應用程序的堆快照輸出到D盤的heap.hprof文件中,以後,能夠經過多種工具分析該堆文件。

jmap工具主要選項:

選項 描述
-dump 生成 Java 堆轉儲快照。
-finalizerinfo 顯示在 F-Queue 中等待 Finalizer 線程執行 finalize 方法的對象。Linux平臺
-heap 顯示 Java 堆詳細信息,好比:用了哪一種回收器、參數配置、分代狀況。Linux 平臺
-histo 顯示堆中對象統計信息,包括類、實例數量、合計容量
-permstat 顯示永久代內存狀態,jdk1.7,永久代
-F 當虛擬機進程對 -dump 選項沒有響應式,能夠強制生成快照。Linux平臺

2.五、jhat:堆轉儲快照分析

JDK提供jhat命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。 jhat內置了一個微型的HTTP/Web服務器,生成堆轉儲快照的分析結果後,能夠在瀏覽器中查看。

之前面生成的heap.hprof爲例:

jhat分析堆快照

屏幕顯示「Server is ready.」的提示後,用戶在瀏覽器中輸入http://localhost:7000/能夠看到分析結果

jhat分析結果

2.六、jstack:Java堆棧跟蹤

jstack命令用於生成虛擬機當前時刻的線程快照(通常稱爲threaddump或者 javacore文件)。

jstack命令格式:

jstack [ option ] vmid

以下,使用stack查看線程堆棧的部分結果:

使用jstack查看線程堆棧

jstack工具主要選項:

選項 描述
-F 當正常輸出的請求不被響應時,強制輸出線程堆棧
-l 除了堆棧外,顯示關於鎖的附加信息
-m 若是調用的是本地方法的話,能夠顯示 c/c++的堆棧

2.七、jcmd:多功能命令

在jdk1.7之後,新增了一個請打的命令行工具jcmd,它能夠實現上面除了jstat外全部命令的功能。

例如,使用jcmd列出當前系統中的全部運行中的Java虛擬機:

jcmd列出虛擬機

jmcd命令格式:

jcmd <pid | main class> <command ... | PerfCounter.print | -f  file>

jmcd工具主要選項:

選項 描述
help 打印幫助信息,示例:jcmd help []
ManagementAgent.stop 中止JMX Agent
ManagementAgent.start_local 開啓本地JMX Agent
ManagementAgent.start 開啓JMX Agent
Thread.print 參數-l打印java.util.concurrent鎖信息,至關於:jstack
PerfCounter.print 至關於:jstat -J-Djstat.showUnsupported=true -snap
GC.class_histogram 至關於:jmap -histo
GC.heap_dump 至關於:jmap -dump:format=b,file=xxx.bin
GC.run_finalization 至關於:System.runFinalization()
GC.run 至關於:System.gc()
VM.uptime 參數-date打印當前時間,VM啓動到如今的時候,以秒爲單位顯示
VM.flags 參數-all輸出所有,至關於:jinfo -flags , jinfo -flag
VM.system_properties 至關於:jinfo -sysprops
VM.command_line 至關於:jinfo -sysprops grep command
VM.version 至關於:jinfo -sysprops grep version


參考:

【1】:周志朋編著《深刻理解Java虛擬機:JVM高級特性與最佳實踐》

【2】:《Java性能權威指南》

【3】:《實戰JAVA虛擬機 JVM故障診斷與性能優化》

【4】:jcmd命令詳解

相關文章
相關標籤/搜索