JVM 常用命令行工具
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|? 低吟不作語(yǔ)
來(lái)源 |? urlify.cn/Rz67bm
76套java從入門到精通實(shí)戰(zhàn)課程分享
一、基礎(chǔ)故障處理工具
Java 開(kāi)發(fā)人員肯定都知道 JDK 的 bin 目錄下有許多小工具,這些小工具除了用于編譯和運(yùn)行 Java 程序外,打包、部署、簽名、調(diào)試、監(jiān)控、運(yùn)維等各種場(chǎng)景都可能會(huì)見(jiàn)到它們的影子
本文主要介紹的是用于監(jiān)視虛擬機(jī)運(yùn)行狀態(tài)和進(jìn)行故障處理的工具,根據(jù)軟件可用性和授權(quán)的不同,可以分成三類:
商業(yè)授權(quán)工具:主要是 JMC(Java Mission Control)及它要使用到的 JFR(Java Flight Recorder)。JMC 在個(gè)人開(kāi)發(fā)環(huán)境中使用是免費(fèi)的,但在商業(yè)環(huán)境中使用則需付費(fèi)
正式支持工具:這一類工具屬于長(zhǎng)期被支持的工具
實(shí)驗(yàn)性工具:這一類工具帶有實(shí)驗(yàn)性質(zhì),日后可能會(huì)轉(zhuǎn)正,也可能會(huì)在某個(gè) JDK 版本中無(wú)聲無(wú)息地消失
二、虛擬機(jī)進(jìn)程狀況工具
使用 jps(JVM Process Status Tool)可以列出正在運(yùn)行的虛擬機(jī)進(jìn)程,并顯示虛擬機(jī)執(zhí)行主類(main 函數(shù)所在的類)名稱以及這些進(jìn)程的本地虛擬機(jī)唯一 ID(LVMID,Local Virtual Machine Identifier)
該命令可以獲取虛擬機(jī)進(jìn)程的 LVMID,從而定位想要監(jiān)控的程序,而 LVMID 一般與操作系統(tǒng)的進(jìn)程 ID 一致
jps?[options]?[hostid]jps 也可以通過(guò) RMI 協(xié)議查詢開(kāi)啟了 RMI 服務(wù)的遠(yuǎn)程 Java 虛擬機(jī)進(jìn)程狀態(tài),參數(shù) hostid 為 RMI 注冊(cè)表中注冊(cè)的主機(jī)名
jps 的其他常用選項(xiàng)如表:
| -q | 只輸出 LVMID,省略主類的名稱 |
| -m | 輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)傳遞給主類 main() 函數(shù)的參數(shù) |
| -l | 輸出主類的全名,如果進(jìn)程執(zhí)行的是 JAR 包,則輸出 |
| -v | 輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)的 JVM 參數(shù) |
三、虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具
jstat(JVM Statistics Monitoring Tool)是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具,可以顯示本地或者遠(yuǎn)程虛擬機(jī)進(jìn)程中的類加載、內(nèi)存、垃圾收集、即時(shí)編譯等運(yùn)行時(shí)數(shù)據(jù)
jstat?[?option?vmid?[interval[s|ms]?[count]]?]如果是本地虛擬機(jī)進(jìn)程,VMID 與 LVMID 是一致的;如果是遠(yuǎn)程虛擬機(jī)進(jìn)程,那 VMID 的格式應(yīng)當(dāng)是
[protocaol:][//]lvmid[@hostname[:port]/servername]參數(shù) interval 和 count 代表查詢間隔和次數(shù),如果省略這兩個(gè)參數(shù),說(shuō)明只查詢一次。假設(shè)需要每 250 毫秒查詢一次進(jìn)程 2764 的垃圾收集情況,一共查詢 20 次,那命令應(yīng)當(dāng)是
jstat?-gc?2764?250?20選項(xiàng) option 代表用戶希望查詢的虛擬機(jī)信息,主要分三類:類加載、垃圾收集、運(yùn)行期編譯狀況等
| -class | 監(jiān)視類加載、卸載數(shù)量、總空間以及類裝載所耗費(fèi)的時(shí)間 |
| -gc | 監(jiān)視 Java 堆狀況,包括 Eden 區(qū)、兩個(gè) Survivor 區(qū)、老年代、永久代等的容量、已用空間、垃圾收集時(shí)間合計(jì)等信息 |
| -gccapacity | 監(jiān)視內(nèi)容與 -gc 基本相同,但輸出主要關(guān)注 Java 堆各個(gè)區(qū)域使用到的最大、最小空間 |
| -gcutil | 監(jiān)視內(nèi)容與 -gc 基本相同,但輸出主要關(guān)注已使用空間占總空間的百分比 |
| -gccause | 與 -gcutil 功能一樣,但會(huì)額外輸出導(dǎo)致上一次垃圾收集產(chǎn)生的原因 |
| -gcnew | 監(jiān)視新生代垃圾收集情況 |
| -gcnewcapacity | 監(jiān)視內(nèi)容與 -gcnew 基本相同,但輸出主要關(guān)注使用到的最大、最小空間 |
| -gcold | 監(jiān)視老年代垃圾收集情況 |
| -gcoldcapacity | 監(jiān)視內(nèi)容與 -gcold 基本相同,但輸出主要關(guān)注使用到的最大、最小空間 |
| -gcpermcapacity | 輸出永久代使用到的最大、最小空間 |
| -compiler | 輸出即時(shí)編譯器編譯過(guò)的方法、耗時(shí)等信息 |
| -printcompilation | 輸出已經(jīng)被即時(shí)編譯的方法 |
四、Java 配置信息工具
jinfo(Configuration Info for Java)的作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù),使用 jps 命令的 -v 參數(shù)可以查看虛擬機(jī)啟動(dòng)時(shí)顯示指定的參數(shù)列表,獲取 pid
jinfo?[option]?pid使用 -flag
jinfo?-flag?PrintGC?21768使用 -flag [+|-]
jinfo?-flag?+PrintGC?21768
jinfo?-flag?-PrintGC?21768使用 -flag
jinfo?-flag?HeapDumpPath=C:\error.hprof?21768剩下的常用選項(xiàng)如表
| -flags | 打印虛擬機(jī)參數(shù),如 -XX:NewSize |
| no option | 不帶任何選項(xiàng)時(shí),會(huì)同時(shí)打印虛擬機(jī)參數(shù)和系統(tǒng)參數(shù) |
| -sysprops | 打印系統(tǒng)參數(shù) |
| -h | -help | 打印幫助信息 |
五、Java 內(nèi)存映射工具
jmap(Memory Map for Java)命令用于生成堆轉(zhuǎn)儲(chǔ)快照,還可以查詢 finalize 執(zhí)行隊(duì)列、Java 堆和方法區(qū)的詳細(xì)信息,如空間使用率、當(dāng)前用的是哪種收集器等
jmap?[option]?vmidoption 選項(xiàng)的合法值與具體含義
| -dump | 生成 Java 堆轉(zhuǎn)儲(chǔ)快照,格式為 -dump:[live,]format=b,file= |
| -finalizerinfo | 顯示在 F-Queue 中等待 Finalizer 線程執(zhí)行 finalize 方法的對(duì)象 |
| -heap | 顯示 Java 堆詳細(xì)信息,如使用哪種回收期、參數(shù)配置、分代狀況 |
| -histo | 顯示堆中對(duì)象統(tǒng)計(jì)信息,包括類、實(shí)例數(shù)量、合計(jì)容量 |
| -permstat | 以 ClassLoader 為統(tǒng)計(jì)口徑顯示永久代內(nèi)存狀態(tài) |
| -F | 當(dāng)虛擬機(jī)進(jìn)程對(duì) -dump 選項(xiàng)沒(méi)有響應(yīng)時(shí),可使用該選項(xiàng)強(qiáng)制生成 dump 快照 |
六、虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具
JDK 提供 jhat(JVM Heap Analysis Tool)命令和 jmap 搭配使用,用來(lái)分析 jmap 生成的堆轉(zhuǎn)儲(chǔ)快照。不過(guò) jhat 的分析功能相等簡(jiǎn)陋,一般會(huì)使用其他功能更強(qiáng)大的分析工具
jhat 內(nèi)置一個(gè)簡(jiǎn)單的 web 服務(wù)器,此命令執(zhí)行后,jhat 在命令行里顯示分析結(jié)果的訪問(wèn)地址,可以用 -port 選項(xiàng)指定端口
有時(shí) dump 出來(lái)的堆很大,在啟動(dòng)時(shí)會(huì)報(bào)堆空間不足的錯(cuò)誤,可以使用如下參數(shù)
jhat?-J-Xmx512m??#?這個(gè)內(nèi)存大小可根據(jù)自己電腦進(jìn)行設(shè)置
七、Java 堆棧跟蹤工具
jstack(Stack Trace for Java)命令用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照(一般稱為 threaddump 或 javacore 文件)。線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的目的通常是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程間死鎖、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間掛起等? ?
jstack?[option]?vmidoption 選項(xiàng)的合法值與具體含義如表
| -F | 當(dāng)正常輸出的請(qǐng)求不被響應(yīng)時(shí),強(qiáng)制輸出線程堆棧 |
| -l | 除堆棧外,顯示關(guān)于鎖的附加信息 |
| -m | 如果調(diào)用到本地方法的話,可以顯示 C/C++ 的堆棧 |
從 JDK5 開(kāi)始,java.lang.Thread 類新增了一個(gè) getAllStackTraces() 方法用于獲取虛擬機(jī)中所有線程的 StackTraceElement 對(duì)象,使用這個(gè)方法可以完成 jstack 的大部分功能,在實(shí)際項(xiàng)目中可以調(diào)用這個(gè)方法做一個(gè)管理員頁(yè)面,隨時(shí)使用瀏覽器來(lái)查閱線程堆棧
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
???

?長(zhǎng)按上方微信二維碼?2 秒
感謝點(diǎn)贊支持下哈?
