JVM詳解3.JDK監(jiān)控和故障處理工具

一年又一年,字節(jié)跳動(dòng) Lark(飛書) 研發(fā)團(tuán)隊(duì)又雙叒叕開(kāi)始招新生啦倚喂!
【內(nèi)推碼】:GTPUVBA
【內(nèi)推鏈接】:https://job.toutiao.com/s/JRupWVj
【招生對(duì)象】:20年9月后~21年8月前 畢業(yè)的同學(xué)
【報(bào)名時(shí)間】:6.16-7.16(提前批簡(jiǎn)歷投遞只有一個(gè)月抓住機(jī)會(huì)哦C颗瘛)
【畫重點(diǎn)】:提前批和正式秋招不矛盾!面試成功,提前鎖定Offer焦读;若有失利子库,額外獲得一次面試機(jī)會(huì),正式秋招開(kāi)啟后還可再次投遞矗晃。

點(diǎn)擊進(jìn)入我的博客

3.1 JDK命令行工具

JDK中的工具列表(JDK8)

tools.jar

這些工具大多數(shù)是tools.jar類庫(kù)的一層薄的包裝仑嗅,它們的主要功能代碼是在tools類庫(kù)中實(shí)現(xiàn)的。還有一些甚至就是由Shell腳本直接生成的喧兄。

名稱 作用
jps JVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程
jstat JVM Statistics Monitoring Tool啊楚,用于收集HotSpot虛擬機(jī)各方面的運(yùn)行數(shù)據(jù)
jinfo Configuration Info for Java吠冤,顯示虛擬機(jī)配置信息
jmap Memory Map for Java,生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲(chǔ)快照(heapdump文件)
jhat JVM Heap Dump Browser恭理,用于分析heapmap文件拯辙,它會(huì)建立一個(gè)http/html服務(wù)器讓用戶可以在瀏覽器上查看分析結(jié)果
jstack Stack Trace for Java,顯示虛擬機(jī)的線程快照

3.1.1 jps:虛擬機(jī)進(jìn)程狀況工具

作用
  • 可以列出正在運(yùn)行的虛擬機(jī)進(jìn)程颜价,并顯示虛擬機(jī)執(zhí)行主類名稱(main()函數(shù)所在的類)以及這些進(jìn)程的本地虛擬機(jī)唯一ID(Local Virtual Machine Identifier)涯保。
  • 對(duì)于本地虛擬機(jī)進(jìn)程來(lái)說(shuō),LVMI與操作系統(tǒng)的進(jìn)程ID(Process Identifier周伦,PID)是一致的夕春。
  • jps可以通過(guò)RMI協(xié)議開(kāi)啟了RMI服務(wù)的遠(yuǎn)程虛擬機(jī)進(jìn)程狀態(tài),hostid為RMI注冊(cè)表中注冊(cè)的主機(jī)名专挪。
命令格式

jsp [options] [hostid]

主要選項(xiàng)
屬性 作用
-p 只輸出LVMID及志,省略主類的名稱
-m 輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)傳遞給主類main()函數(shù)的參數(shù)
-l 輸出主類的全名,如果進(jìn)程執(zhí)行的是jar包寨腔,輸出jar路徑
-v 輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)jvm參數(shù)

3.1.2 jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具

作用

jstat是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具速侈。它可以顯示本地或者遠(yuǎn)程虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存迫卢、垃圾回收倚搬、JIT編譯等運(yùn)行數(shù)據(jù),在沒(méi)有GUI圖形界面乾蛤,只是提供了純文本控制臺(tái)環(huán)境的服務(wù)器上每界,它將是運(yùn)行期定位虛擬機(jī)性能問(wèn)題的首選工具。

命令格式
  • jstat [option vmid [interval [s|ms] [count]]]
  • 對(duì)于命令格式中的VMID和LVMID家卖,如果是本地虛擬機(jī)進(jìn)程盆犁,VMID和LVMID是一致的
  • 如果是遠(yuǎn)程虛擬機(jī),那VMID的格式應(yīng)當(dāng)是:[protocol:] [//] lvmid[@hostname[:port]/servername]
  • 參數(shù)interval和count分別表示查詢的間隔和次數(shù)篡九,如果省略這兩個(gè)參數(shù)谐岁,說(shuō)明只查詢一次。
主要選項(xiàng)
選項(xiàng) 作用
-class 監(jiān)視裝載類、卸載類伊佃、總空間以及類裝載所耗費(fèi)的時(shí)間
-gc 監(jiān)視java堆狀況窜司,包括eden區(qū)、兩個(gè)survivor區(qū)航揉、老年代塞祈、永久代等的容量、已用空間帅涂、GC時(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)致上一次gc產(chǎn)生的原因
-gcnew 監(jiān)視新生代GC情況
-gcnewcapacity 監(jiān)視內(nèi)容與-gcnew基本相同,輸出主要關(guān)注使用到的最大醇锚、最小空間
-gcold 監(jiān)視老年代GC情況
-gcoldcapacity 監(jiān)視內(nèi)容與-gcold基本相同哼御,輸出主要關(guān)注使用到的最大、最小空間
-gcpermcapacity 輸出永久代使用到的最大焊唬、最小空間
-compiler 輸出JIT編譯過(guò)的方法恋昼、耗時(shí)等信息
-printcompilation 輸出已經(jīng)被JIT編譯過(guò)的方法
示例
示例
  • S0:Survivor1區(qū)當(dāng)前使用比例
  • S1:Survivor2區(qū)當(dāng)前使用比例
  • E:Eden區(qū)使用比例 9.36%
  • O:老年代使用比例
  • M:元數(shù)據(jù)區(qū)使用比例
  • CCS:壓縮使用比例
  • YGC:年輕代垃圾回收次數(shù) 7次
  • FGC:老年代垃圾回收次數(shù) 6次
  • FGCT:老年代垃圾回收消耗時(shí)間 0.119秒
  • GCT:垃圾回收消耗總時(shí)間 0.145秒

3.1.3 jinfo:Java配置信息工具

作用

jinfo的作用是實(shí)時(shí)的查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)。

命令格式

jinfo [option] pid

主要選項(xiàng)
選項(xiàng) 作用
-flag <name> to print the value of the named VM flag
-flag [+/-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags to print VM flags
-sysprops to print Java system properties
<no option> to print both of the above
-h / -help to print this help message

3.1.4 jmap:Java內(nèi)存映像工具

作用
  • jmap命令用于生成堆轉(zhuǎn)儲(chǔ)快照赶促。
  • 查詢finalize執(zhí)行隊(duì)列液肌、java堆和永久代的詳細(xì)信息。如空間使用率鸥滨、當(dāng)前用的是哪種收集器等矩屁。
命令格式

jmap [option] vmid

主要選項(xiàng)
選項(xiàng) 作用
-dump 生成java堆轉(zhuǎn)儲(chǔ)快照。格式為: -dump:[live,]format=b,file=<filename>,其中l(wèi)ive子參數(shù)說(shuō)明是否只dump出存活的對(duì)象
-finalizerinfo 顯示在F-Queue中等待Finalizer線程執(zhí)行finalize方法的對(duì)象爵赵。只在Linux/Solaris平臺(tái)下有效
-heap 顯示java堆詳細(xì)信息吝秕,如使用哪種收集器、參數(shù)配置空幻、分代情況等烁峭,在Linux/Solaris平臺(tái)下有效
-jisto 顯示堆中對(duì)象統(tǒng)計(jì)信息,包含類秕铛、實(shí)例對(duì)象约郁、合集容量
-permstat 以ClassLoader為統(tǒng)計(jì)口徑顯示永久代內(nèi)存狀態(tài)。只在Linux/Solaris平臺(tái)下有效
-F 當(dāng)虛擬機(jī)進(jìn)程對(duì)-dump選項(xiàng)沒(méi)有相應(yīng)時(shí)但两△廾罚可使用這個(gè)選項(xiàng)強(qiáng)制生成dump快照。只在Linux/Solaris平臺(tái)下有效

3.1.5 jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具

作用
  • 提供jhat與jmap搭配使用谨湘,來(lái)分析dump生成的堆快照绽快。jhat內(nèi)置了一個(gè)微型的HTTP/HTML服務(wù)器芥丧,生成dump文件的分析結(jié)果后,可以在瀏覽器中查看坊罢。
  • 一般不會(huì)去直接使用jhat命令來(lái)分析demp文件:原因一是一般不會(huì)在部署應(yīng)用程序的服務(wù)器上直接分析dump文件续担,一般會(huì)盡量將dump文件拷貝到其他機(jī)器上進(jìn)行分析,因?yàn)榉治龉ぷ魇且粋€(gè)耗時(shí)且消耗硬件資源的過(guò)程活孩,既然都要在其他機(jī)器上進(jìn)行物遇,就沒(méi)必要受到命令行工具的限制了;另外一個(gè)原因是jhat的分析功能相對(duì)來(lái)說(shuō)很簡(jiǎn)陋憾儒,VisualVM以及專門分析dump文件的Eclipse Memory Analyzer询兴、IBM HeapAnalyzer等工具,都能實(shí)現(xiàn)比jhat更強(qiáng)大更專業(yè)的分析功能起趾。
命令格式

jhat [ options ] heap-dump-file

3.1.6 jstack:java棧跟蹤工具

作用
  • jstack命令用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照诗舰。
  • 線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧集合,生成線程快照的主要目的是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因阳掐,如線程死鎖始衅、死循環(huán)冷蚂、請(qǐng)求外部資源導(dǎo)致長(zhǎng)時(shí)間等待等缭保。
命令格式

jstack [option] vmid

主要選項(xiàng)
選項(xiàng) 作用
-F 當(dāng)正常輸出的請(qǐng)求不被響應(yīng)時(shí),強(qiáng)制輸出線程堆棧
-l 除堆棧外蝙茶,顯示關(guān)于鎖的附加信息
-m 如果調(diào)用到本地方法的話艺骂,可以顯示c/c++的堆棧

3.2 JConsole:JDK可視化工具

JConsole ( Java Monitoring and Management Console ) 是—種基于JMX的可視化監(jiān)視管理工具。它管理部分的功能是針對(duì)JMX MBean進(jìn)行管理隆夯,由于MBean可以使用代碼钳恕、中間件服務(wù)器的管理控制臺(tái)或者所有符合JMX規(guī)范的軟件進(jìn)行訪問(wèn)。


JConsole
概覽

“概述”頁(yè)簽顯示的是整個(gè)虛擬機(jī)主要運(yùn)行數(shù)據(jù)的概覽,其中包括“堆內(nèi)存使用情況”蹄衷、“線程”忧额、“類”、“CPU使用情況”4種信息的曲線圖

內(nèi)存

“內(nèi)存”頁(yè)簽相當(dāng)于可視化的jstat命令愧口,用于監(jiān)視受收集器管理的虛擬機(jī)內(nèi)存(Java堆和永久代)的變化趨勢(shì)睦番。

線程

“線程”頁(yè)簽的功能相當(dāng)于可視化的jstack命令,遇到線程停頓時(shí)可以使用這個(gè)頁(yè)簽進(jìn)行監(jiān)控分析耍属。

3.3 VisualVM:可視化工具

VisualVM(All-in-One Java Troubleshooting Tool)是到目前為止隨JDK發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序托嚣,并且可以預(yù)見(jiàn)在未來(lái)一段時(shí)間內(nèi)都是官方主力發(fā)展的虛擬機(jī)故障處理工具。官方在VisualVM的軟件說(shuō)明中寫上了“All-in-One” 的描述字樣厚骗,預(yù)示著它除了運(yùn)行監(jiān)視示启、故障處理外,還提供了很多其他方面的功能领舰。如性能分析夫嗓,VisualVM的性能分析功能甚至比起JProfiler迟螺、YourKit等專業(yè)且收費(fèi)的Profiling工具都不會(huì)遜色多少,而且VisualVM的還有一個(gè)很大的優(yōu)點(diǎn):不需要被監(jiān)視的程序基于特殊Agent運(yùn)行啤月,因此它對(duì)應(yīng)用程序的實(shí)際性能的影響很小,使得它可以直接應(yīng)用在生產(chǎn)環(huán)境中煮仇。這個(gè)優(yōu)點(diǎn)是JProfiler、YourKit等工具無(wú)法與之媲美的谎仲。

VisualVM兼容范圍與插件安裝

VisualVM基于NetBeans平臺(tái)開(kāi)發(fā)浙垫,因此它一開(kāi)始就具備了插件擴(kuò)展功能的特性,通過(guò)插件擴(kuò)展支持郑诺,VisualVM可以做到:

  • 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置夹姥、環(huán)境信息(jps、 jinfo)辙诞。
  • 監(jiān)視應(yīng)用程序的CPU辙售、GC、堆飞涂、方法區(qū)以及線程的信息(jstat旦部、jstack)。
  • dump以及分析堆轉(zhuǎn)儲(chǔ)快照(jmap较店、jhat)士八。
  • 方法級(jí)的程序運(yùn)行性能分析,找出被調(diào)用最多、運(yùn)行時(shí)間最長(zhǎng)的方法梁呈。
  • 離線程序快照:收集程序的運(yùn)行時(shí)配置婚度、線程dump、內(nèi)存dump等信息建立個(gè)快照, 可以將快照發(fā)送開(kāi)發(fā)者處進(jìn)行Bug反饋官卡。
生成蝗茁、瀏覽堆轉(zhuǎn)儲(chǔ)快照

在VisualVM中生成dump文件有兩種方式,可以執(zhí)行下列任一操作:

  • 在“應(yīng)用程序”窗口中右鍵單擊應(yīng)用程序節(jié)點(diǎn),然后選擇“堆Dump”。
  • 在“應(yīng)用程序”窗口中雙擊應(yīng)用程序節(jié)點(diǎn)以打開(kāi)應(yīng)用程序標(biāo)簽,然后在“監(jiān)視”標(biāo)簽中單擊“堆Dump”寻咒。
分析程序性能

在Profiler頁(yè)簽中哮翘,VisualVM提供了程序運(yùn)行期間方法級(jí)的CPU執(zhí)行時(shí)間分析以及內(nèi)存分析,做Profiling分析肯定會(huì)對(duì)程序運(yùn)行性能有比較大的影響毛秘,所以一般不在生產(chǎn)環(huán)境中使用這項(xiàng)功能饭寺。

BTrace動(dòng)態(tài)日志跟蹤

BTrace本身也是可以獨(dú)立運(yùn)行的程序。它的作用是在不停止目標(biāo)程序運(yùn)行的前提下熔脂,通過(guò)HotSpot虛擬機(jī)的HotSwap技術(shù)動(dòng)態(tài)加入原本并不存在的調(diào)試代碼佩研。這項(xiàng)功能對(duì)實(shí)際生產(chǎn)中的程序很有意義:經(jīng)常遇到程序出現(xiàn)問(wèn)題,但排查錯(cuò)誤的一些必要信息霞揉,譬如方法參數(shù)旬薯、返回值等,在開(kāi)發(fā)時(shí)并沒(méi)有打印到日志之中,以至于不得不停掉服務(wù)适秩,通過(guò)調(diào)試增量來(lái)加入日志代碼以解決問(wèn)題绊序。當(dāng)遇到生產(chǎn)環(huán)境服務(wù)無(wú)法隨便停止時(shí)硕舆,缺一兩句日志導(dǎo)致排錯(cuò)進(jìn)行不下去是一件非常郁悶的事情。BTrace的用法還有許多骤公,打印調(diào)用堆棧抚官、參數(shù)、返回值只是最基本的應(yīng)用阶捆,在它的網(wǎng)站上有使用BTrace進(jìn)行性能監(jiān)視凌节、定位連接泄漏和內(nèi)存泄漏、解決多線程競(jìng)爭(zhēng)問(wèn)題的例子洒试。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倍奢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垒棋,更是在濱河造成了極大的恐慌卒煞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叼架,死亡現(xiàn)場(chǎng)離奇詭異畔裕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乖订,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門扮饶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人垢粮,你說(shuō)我怎么就攤上這事贴届】糠啵” “怎么了蜡吧?”我有些...
    開(kāi)封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)占键。 經(jīng)常有香客問(wèn)我昔善,道長(zhǎng),這世上最難降的妖魔是什么畔乙? 我笑而不...
    開(kāi)封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任君仆,我火速辦了婚禮墩朦,結(jié)果婚禮上辩涝,老公的妹妹穿的比我還像新娘烹棉。我一直安慰自己玻淑,他們只是感情好淳附,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布嘱么。 她就那樣靜靜地躺著糠悯,像睡著了一般甥雕。 火紅的嫁衣襯著肌膚如雪难述。 梳的紋絲不亂的頭發(fā)上萤晴,一...
    開(kāi)封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天吐句,我揣著相機(jī)與錄音,去河邊找鬼店读。 笑死嗦枢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屯断。 我是一名探鬼主播文虏,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼殖演!你這毒婦竟也來(lái)了择葡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤剃氧,失蹤者是張志新(化名)和其女友劉穎敏储,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體朋鞍,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡已添,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滥酥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片更舞。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坎吻,靈堂內(nèi)的尸體忽然破棺而出缆蝉,到底是詐尸還是另有隱情,我是刑警寧澤瘦真,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布刊头,位于F島的核電站,受9級(jí)特大地震影響诸尽,放射性物質(zhì)發(fā)生泄漏原杂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一您机、第九天 我趴在偏房一處隱蔽的房頂上張望穿肄。 院中可真熱鬧,春花似錦际看、人聲如沸咸产。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脑溢。三九已至,卻和暖如春蔼囊,著一層夾襖步出監(jiān)牢的瞬間焚志,已是汗流浹背衣迷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酱酬,地道東北人壶谒。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像膳沽,于是被迫代替她去往敵國(guó)和親汗菜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容