天天看點

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

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

在實際的故障排查、性能監控中,常常是作業系統的工具和Java虛拟機的工具結合使用。

1、作業系統工具

1.1、top:顯示系統整體資源使用情況

top指令是Linux下常用的性能分析工具,能夠實時顯示系統中各個程序的資源占用情況。

在Linux使用top指令的部分輸出如下:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

top指令的輸出可以分為兩個部分:前半部分是系統統計資訊,後半部分是程序資訊。

在統計資訊中:

  • 第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.2、vmstat:監控記憶體和CPU

vmstat也是一款功能比較齊全的性能監測工具。它可以統計CPU、記憶體使用情況、swap使用情況能資訊。

一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,機關是秒,第二個參數是采樣的次數,如:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

以下指令表示每秒采樣一次,共三次。

輸出的各個列的含義:

分類 說明
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.3、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.4、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
 ...
      

以上指令表示列出所有端口資訊。

2、JDK性能監控工具

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

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

2.1、jps:虛拟機程序檢視

jps類似Linux下的ps,它會列出Java程式的程序。

jps指令格式:

jps [ options ] [ hostid ]       

jps指令示例:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

jps的常用選項見表:

選項清單 描述
-q 隻輸出程序 ID,忽略主類資訊
-l 輸出主類全名,或者執行 JAR 包則輸出路徑
-m 輸出虛拟機程序啟動時傳遞給主類 main()函數的參數
-v 輸出虛拟機程序啟動時的 JVM 參數

2.2、jstat:虛拟機運作時資訊檢視

jsta是一個強大的工具。它可以顯示本地或者遠端虛拟機程序中的類加載、記憶體、垃圾收集、即時編譯等運作時資料。

jstat指令格式為:

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

選項option代表使用者希望查詢的虛拟機資訊,主要分為三類:類加載、垃圾收集、運作期編譯狀況。

如下,輸出Java程序5728的ClassLoader相關資訊,每秒統計一次資訊,一共輸出兩次。

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

下例展示了與GC相關的堆資訊的輸出:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

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.3、jinfo:虛拟機配置檢視

jinfo的作用是實時檢視和調整虛拟機各項參數。

jinfo指令格式:

jinfo [ option ] pid      

下例顯示了新生愛對象晉升老年代的最大年齡。在應用程式啟動時,沒有指定,但通過jinfo,檢視該參數的目前數值。

檢視是否列印GC詳細資訊:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

2.4、jmap:記憶體映像(導出)

jmap指令用于生成堆轉儲快照(一般稱為heapdump或dump檔案)

jmap的作用并不僅僅是為了擷取堆轉儲快照,它還可以查詢finalize執行隊列、Java堆和方法區的詳細資訊,如空間使用率、目前用的是哪種收集器等。

jmap指令格式:

jmap [ option ] vmid      

如下,使用jmap生成PID為5728的Java程式的對象統計資訊, 并輸出到dump.txt中。

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

dump.txt的結構如下:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

jmap更重要的功能是得到Java程式的目前堆快照:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

如圖,将應用程式的堆快照輸出到D盤的heap.hprof檔案中,之後,可以通過多種工具分析該堆檔案。

jmap工具主要選項:

選項
-dump 生成 Java 堆轉儲快照。
-finalizerinfo 顯示在 F-Queue 中等待 Finalizer 線程執行 finalize 方法的對象。Linux平台
-heap 顯示 Java 堆詳細資訊,比如:用了哪種回收器、參數配置、分代情況。Linux 平台
-histo 顯示堆中對象統計資訊,包括類、執行個體數量、合計容量
-permstat 顯示永久代記憶體狀态,jdk1.7,永久代
-F 當虛拟機程序對 -dump 選項沒有響應式,可以強制生成快照。Linux平台

2.5、jhat:堆轉儲快照分析

JDK提供jhat指令與jmap搭配使用,來分析jmap生成的堆轉儲快照。 jhat内置了一個微型的HTTP/Web伺服器,生成堆轉儲快照的分析結果後,可以在浏覽器中檢視。

以前面生成的heap.hprof為例:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

螢幕顯示“Server is ready.”的提示後,使用者在浏覽器中輸入http://localhost:7000/可以看到分析結果

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

2.6、jstack:Java堆棧跟蹤

jstack指令用于生成虛拟機目前時刻的線程快照(一般稱為threaddump或者 javacore檔案)。

jstack指令格式:

jstack [ option ] vmid      

如下,使用stack檢視線程堆棧的部分結果:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

jstack工具主要選項:

當正常輸出的請求不被響應時,強制輸出線程堆棧
除了堆棧外,顯示關于鎖的附加資訊
如果調用的是本地方法的話,可以顯示 c/c++的堆棧

2.7、jcmd:多功能指令

在jdk1.7以後,新增了一個請打的指令行工具jcmd,它可以實作上面除了jstat外所有指令的功能。

例如,使用jcmd列出目前系統中的所有運作中的Java虛拟機:

【JVM進階之路】八:性能監控工具-指令行篇1、作業系統工具2、JDK性能監控工具

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 grep command
VM.version grep version