Java 故障处理与性能监控工具
文章目錄
- 概述
- 基礎工具
- jps
- jstat
- jinfo
- jmap
- jhat
- jstack
- 高級工具
- VisualVM
- VisualVM 的主要功能
- Arthas
- GC Easy
概述
在使用 Java 語言進行開發(fā)的過程中,我們很可能會遇到各種程序問題。
比如,可能會遇見程序突然就靜止不動了,但是程序進程依然顯示在后臺進行;也可能會遇見程序莫名其妙地卡頓,甚至崩潰。當問題比較直觀時,例如程序日志中明確地告訴你出現了一個 NPE 異常,出現在哪一行,那排查問題就會順暢很多。
但是很多時候出現的問題可能沒有那么直觀,所以我們需要學習使用一些工具來排查問題,或者進行性能監(jiān)控。
基礎工具
基礎工具,這里主要介紹由 JDK 自帶的幾個用于查看或追蹤 Java 應用運行情況的命令行工具。
jps
jps,即 Java Process Status。從名字就可以看出,這是個與 Java 進程相關的的命令行工具。
這個命令用于列出正在運行的 Java 進程,并顯示該進程中虛擬機執(zhí)行的主類。例如:
可以看出,所有運行中的 Java 進程都被打印出來了,打印出來的信息中有兩列,前一列是進程的 id,后一項是虛擬機執(zhí)行的主類(運行 Main 方法的類)
jps 命令是一個非常常用,也是非常實用的命令,在后續(xù)介紹的工具中,基本都需要先使用 jps 命令獲取對應程序的進程 id 后才能使用
jstat
jstat,即 JVM Statistics Monitoring Tool,是一個用于監(jiān)控虛擬機各種運行信息的命令行工具。
它可以顯示當前運行的 Java 進程中的內存使用情況、類加載數據、垃圾收集信息等實時運行數據,功能十分強大。
jstat 主要的參數有:
- -class:顯示當前類加載相關信息
- -gc:顯示當前虛擬機堆以及方法區(qū)的使用情況,以及垃圾收集相關的數據
比較常用的是 -gc 參數,格式為:jstat -gc 進程 id。例如:
可以看出,指定的 Java 進程的垃圾收集相關信息都被打印了出來,在排查內存問題時比較常用
jinfo
jinfo,即 Configuration Info For Java,是一個用于查看和調整虛擬機各項參數的命令行工具。
它的功能主要分為以下幾個部分:
- 不指定參數時,查看所有參數的值
- -flag 參數查看指定參數的值
- -flags 參數查看未顯式指定的參數對應的值(默認值)
- 在 JDK 6 以后,可以使用 -flag 參數動態(tài)修改部分參數值
使用的格式為:jinfo [option] 進程 id。例如:
可以看出,15848 這個進程的最大堆內存空間大小為 734003200 bit
jmap
jmap,即 Memory Map For Java,是一個用于生成堆轉儲快照(堆 dump 文件)的命令行工具。
通常情況下,當我們需要查看堆內各對象的存活情況時,就需要用到堆 dump 文件。堆 dump 文件即觸發(fā)堆轉儲那一刻的堆內使用情況快照,內部包含了各對象的存活情況及引用鏈等信息,對于問題定位有非常大的幫助。
獲取堆 dump 文件我們也可以設置當出現 OOM 異常時,讓虛擬機自動轉儲堆 dump 文件到指定目錄。如果想要在虛擬機正常運行時獲取堆 dump 文件,就需要用到 jmap 命令了。
jmap 命令除了獲取堆 dump 文件之外,還可以查詢 finalize 執(zhí)行隊列,當前使用垃圾收集器種類等信息。
jmap 命令的主要參數為:
- -dump:生成堆 dump 文件
- -heap:顯示當前使用的垃圾收集器種類等信息
在日常開發(fā)過程中,用的比較多的還是生成堆 dump 文件,格式為 jmap -dump:format=b,file=文件位置 進程 id,例如:
可以看出,使用了 jmap -dump 后,在指定位置創(chuàng)建了堆 dump 文件
jhat
jhat,即 JVM Heap Analysis Tool,是一個用于分析堆 dump 文件的命令行工具。
當我們使用 jmap 獲取了堆 dump 文件后,我們是不能直接打開查看文件的,因為里面是用特殊的文件格式來書寫的,所以我們需要借助工具才能看得懂里面的內容。而 jhat 就是一個用于分析堆 dump 文件的工具。
用法也非常簡單,格式為 jhat dump 文件的路徑 即可,例如:
在使用了 jhat 命令后,它會創(chuàng)建一個 Web 服務,用于查看分析結果,例如圖中提示我們在 7000 端口上啟動了一個服務,我們打開 localhost:7000 查看的結果為:
可以看到,jhat 的分析結果在網頁中就展示出來了,頁面上的每個超鏈接都可以繼續(xù)點擊進去查看進一步的分析結果。
但是在實際應用中,jhat 是比較少用的,因為首先 jhat 的分析結果過于粗糙,難以提取有用的信息;其次 JDK 為我們提供了其他更好用的圖形化界面用于分析并查看堆 dump 文件;最后,運行 jhat 命令比較占用系統(tǒng)資源,在堆文件比較大時可能會造成系統(tǒng)卡頓。
jstack
jstack,即 Stack Trace for Java,是一個用于生成虛擬機當前時刻的線程快照(threaddump 文件)的命令行工具。
線程快照,就是正在運行的 Java 線程內某一時刻每一個線程正在運行的方法的堆棧的集合。當正在運行的程序中出現某個請求遲遲不響應,或者說某個線程長時間停頓的情況時,可以使用 jstat 命令查看相關線程的當前執(zhí)行堆棧情況來定位問題的原因。
常用的參數為:
- 不使用任何參數時,將會打印這個進程內的所有 Java 線程的堆棧運行情況
- -l 參數將會額外顯示關于鎖的相關信息
- -m 參數將會把本地方法的執(zhí)行堆棧也顯示出來
比較常用的是 -l 參數,用法為 jstack -l 進程 id,例如:
可以看到,該命令把線程的堆棧信息都打印了出來,由于加了 -l 參數,還出現了鎖相關信息 Locked ownable synchronizers 的內容
高級工具
高級工具,主要指的是多功能合一的,對于問題定位能力有極大提升的工具。這里主要介紹下面幾款:
- JDK 自帶的 VisualVM
- 阿里開源的 Arthas
- 在線 GC 診斷工具 GC Easy
VisualVM
VisualVM ,官方名稱為 All-in-One Java Troubleshooting Tool,是功能最強大的 Java 運行監(jiān)控和故障處理程序之一。
從名稱就可以看出,這肯定是一個多種功能合一的工具。事實也確實如此,它除了常規(guī)的運行監(jiān)控與故障處理外,還提供了性能分析,擴展插件等功能。除此之外,jvisualvm 還有個非常大的優(yōu)點:對于被監(jiān)控的 Java 程序完全無侵入,不需要基于特殊的運行方式,或者定制化的 Agent 去運行。
VisualVM 的啟動方式也很簡單,只需要在命令行輸入 jvisualvm 即可啟動
VisualVM 的主要功能
VisualVM 的主要功能如下所示:
- 顯示當前系統(tǒng)上運行的所有 Java 進程與其環(huán)境信息(jps 和 jinfo 命令的功能)
- 監(jiān)控 Java 程序的垃圾收集相關信息,與堆、方法區(qū)的內存使用信息(jstat 命令的功能)
- 監(jiān)控 Java 程序當前所有線程的堆棧信息(jstack 命令的功能)
- 創(chuàng)建堆 dump 文件,以及分析堆 dump 文件(jmap、jhat 命令的功能)
- 多維度(方法,線程)進行性能分析,可以找出各維度下耗時最長,性能最低下的數據條目
- 其他擴展插件帶來的功能,例如 Visual GC 插件,可以將堆內存的使用情況及 GC 過程通過可視化的界面展示出來
Arthas
Alibaba 開源的一個 JVM 監(jiān)控工具,非常好用,可以在 linux 環(huán)境下運行后查看無圖形化的圖標界面
- 可以通過 jad 命令反編譯線上發(fā)布的代碼,查看是否發(fā)布成功了
- 可以通過 dashboard 命令,查看統(tǒng)計圖表命令
- 可以通過 thread 命令查看現在線程的所有狀態(tài),-b 參數查看是否有死鎖的線程
- 可以通過 ognl 命令查看系統(tǒng)線上變量的值,或者執(zhí)行線上代碼!!
如果線上是集群部署的應用,那么可以通過 zabbix 或者普羅米修斯等集群監(jiān)控工具先定位到是哪臺機器出了問題,然后再在這臺機器上執(zhí)行 arthas 相關命令。
官網地址為:Arthas
GC Easy
這是一款在線且收費的 GC 分析工具,可以通過上傳 GC 日志文件,或者堆 dump 文件來給出調優(yōu)意見,可以在完全不懂業(yè)務代碼的情況下,根據這個工具提供的意見,進行 JVM 的參數調優(yōu),可以稱作是傻瓜式的 JVM 調優(yōu)工具。
官網地址為:GC Easy
總結
以上是生活随笔為你收集整理的Java 故障处理与性能监控工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刚开始学C 语言 怎么编写小程序,用C
- 下一篇: java http url 编码_Jav