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