定位問題的時候,知識、經驗是關鍵基礎,資料是依據,工具是運用知識處理資料的手段,
在實際的故障排查、性能監控中,常常是作業系統的工具和Java虛擬機的工具結合使用,
1、作業系統工具
1.1、top:顯示系統整體資源使用情況
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個行程的資源占用情況,
在Linux使用top命令的部分輸出如下:

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工具的使用是通過兩個數字引數來完成的,第一個引數是采樣的時間間隔數,單位是秒,第二個引數是采樣的次數,如:

以下命令表示每秒采樣一次,共三次,
輸出的各個列的含義:
| 分類 | 說明 |
|---|---|
| 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程式外,打包、部署、簽名、除錯、監控、運維等各種場景都可能會用到它們,

2.1、jps:虛擬機行程查看
jps類似Linux下的ps,它會列出Java程式的行程,
jps命令格式:
jps [ options ] [ hostid ]
jps命令示例:

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相關資訊,每秒統計一次資訊,一共輸出兩次,

下例展示了與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.3、jinfo:虛擬機配置查看
jinfo的作用是實時查看和調整虛擬機各項引數,
jinfo命令格式:
jinfo [ option ] pid
下例顯示了新生愛物件晉升老年代的最大年齡,在應用程式啟動時,沒有指定,但通過jinfo,查看該引數的當前數值,

查看是否列印GC詳細資訊:

2.4、jmap:記憶體映像(匯出)
jmap命令用于生成堆轉儲快照(一般稱為heapdump或dump檔案)
jmap的作用并不僅僅是為了獲取堆轉儲快照,它還可以查詢finalize執行佇列、Java堆和方法區的詳細資訊,如空間使用率、當前用的是哪種收集器等,
jmap命令格式:
jmap [ option ] vmid
如下,使用jmap生成PID為5728的Java程式的物件統計資訊, 并輸出到dump.txt中,

dump.txt的結構如下:

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

如圖,將應用程式的堆快照輸出到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為例:

螢屏顯示“Server is ready.”的提示后,用戶在瀏覽器中輸入http://localhost:7000/可以看到分析結果

2.6、jstack:Java堆疊跟蹤
jstack命令用于生成虛擬機當前時刻的執行緒快照(一般稱為threaddump或者 javacore檔案),
jstack命令格式:
jstack [ option ] vmid
如下,使用stack查看執行緒堆疊的部分結果:

jstack工具主要選項:
| 選項 | 描述 |
|---|---|
| -F | 當正常輸出的請求不被回應時,強制輸出執行緒堆疊 |
| -l | 除了堆疊外,顯示關于鎖的附加資訊 |
| -m | 如果呼叫的是本地方法的話,可以顯示 c/c++的堆疊 |
2.7、jcmd:多功能命令
在jdk1.7以后,新增了一個請打的命令列工具jcmd,它可以實作上面除了jstat外所有命令的功能,
例如,使用jcmd列出當前系統中的所有運行中的Java虛擬機:

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命令詳解
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272345.html
標籤:其他
