摘要:點擊進(jìn)入我的博客命令行工具這些工具大多數(shù)是類庫的一層薄的包裝,它們的主要功能代碼是在類庫中實現(xiàn)的??梢暬ぞ呤堑侥壳盀橹闺S發(fā)布的功能最強大的運行監(jiān)視和故障處理程序,并且可以預(yù)見在未來一段時間內(nèi)都是官方主力發(fā)展的虛擬機故障處理工具。
點擊進(jìn)入我的博客 3.1 JDK命令行工具
這些工具大多數(shù)是tools.jar類庫的一層薄的包裝,它們的主要功能代碼是在tools類庫中實現(xiàn)的。還有一些甚至就是由Shell腳本直接生成的。
名稱 | 作用 | |
---|---|---|
jps | JVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機進(jìn)程 | |
jstat | JVM Statistics Monitoring Tool,用于收集HotSpot虛擬機各方面的運行數(shù)據(jù) | |
jinfo | Configuration Info for Java,顯示虛擬機配置信息 | |
jmap | Memory Map for Java,生成虛擬機的內(nèi)存轉(zhuǎn)儲快照(heapdump文件) | |
jhat | JVM Heap Dump Browser,用于分析heapmap文件,它會建立一個http/html服務(wù)器讓用戶可以在瀏覽器上查看分析結(jié)果 | |
jstack | Stack Trace for Java,顯示虛擬機的線程快照 |
可以列出正在運行的虛擬機進(jìn)程,并顯示虛擬機執(zhí)行主類名稱(main()函數(shù)所在的類)以及這些進(jìn)程的本地虛擬機唯一ID(Local Virtual Machine Identifier)。
對于本地虛擬機進(jìn)程來說,LVMI與操作系統(tǒng)的進(jìn)程ID(Process Identifier,PID)是一致的。
jps可以通過RMI協(xié)議開啟了RMI服務(wù)的遠(yuǎn)程虛擬機進(jìn)程狀態(tài),hostid為RMI注冊表中注冊的主機名。
jsp [options] [hostid]
屬性 | 作用
-p | 只輸出LVMID,省略主類的名稱
-m | 輸出虛擬機進(jìn)程啟動時傳遞給主類main()函數(shù)的參數(shù)
-l | 輸出主類的全名,如果進(jìn)程執(zhí)行的是jar包,輸出jar路徑
-v | 輸出虛擬機進(jìn)程啟動時jvm參數(shù)
jstat是用于監(jiān)視虛擬機各種運行狀態(tài)信息的命令行工具。它可以顯示本地或者遠(yuǎn)程虛擬機進(jìn)程中的類裝載、內(nèi)存、垃圾回收、JIT編譯等運行數(shù)據(jù),在沒有GUI圖形界面,只是提供了純文本控制臺環(huán)境的服務(wù)器上,它將是運行期定位虛擬機性能問題的首選工具。
jstat [option vmid [interval [s|ms] [count]]]
對于命令格式中的VMID和LVMID,如果是本地虛擬機進(jìn)程,VMID和LVMID是一致的
如果是遠(yuǎn)程虛擬機,那VMID的格式應(yīng)當(dāng)是:[protocol:] [//] lvmid[@hostname[:port]/servername]
參數(shù)interval和count分別表示查詢的間隔和次數(shù),如果省略這兩個參數(shù),說明只查詢一次。
選項 | 作用 |
---|---|
-class | 監(jiān)視裝載類、卸載類、總空間以及類裝載所耗費的時間 |
-gc | 監(jiān)視java堆狀況,包括eden區(qū)、兩個survivor區(qū)、老年代、永久代等的容量、已用空間、GC時間合計信息 |
-gccapacity | 監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關(guān)注java堆各個區(qū)域使用到最大、最小空間 |
-gcutil | 監(jiān)視內(nèi)容與-gc基本相同,但輸出主要關(guān)注已使用控件占總空間的百分比 |
-gccause | 與-gcutil功能一樣,但是會額外輸出導(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編譯過的方法、耗時等信息 |
-printcompilation | 輸出已經(jīng)被JIT編譯過的方法 |
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:老年代垃圾回收消耗時間 0.119秒
GCT:垃圾回收消耗總時間 0.145秒
3.1.3 jinfo:Java配置信息工具jinfo的作用是實時的查看和調(diào)整虛擬機各項參數(shù)。
jinfo [option] pid
選項 | 作用 |
---|---|
-flag |
to print the value of the named VM flag |
-flag [+/-] |
to enable or disable the named VM flag |
-flag |
to set the named VM flag to the given value |
-flags | to print VM flags |
-sysprops | to print Java system properties |
to print both of the above | |
-h / -help | to print this help message |
jmap命令用于生成堆轉(zhuǎn)儲快照。
查詢finalize執(zhí)行隊列、java堆和永久代的詳細(xì)信息。如空間使用率、當(dāng)前用的是哪種收集器等。
jmap [option] vmid
選項 | 作用 |
---|---|
-dump | 生成java堆轉(zhuǎn)儲快照。格式為: -dump:[live,]format=b,file= |
-finalizerinfo | 顯示在F-Queue中等待Finalizer線程執(zhí)行finalize方法的對象。只在Linux/Solaris平臺下有效 |
-heap | 顯示java堆詳細(xì)信息,如使用哪種收集器、參數(shù)配置、分代情況等,在Linux/Solaris平臺下有效 |
-jisto | 顯示堆中對象統(tǒng)計信息,包含類、實例對象、合集容量 |
-permstat | 以ClassLoader為統(tǒng)計口徑顯示永久代內(nèi)存狀態(tài)。只在Linux/Solaris平臺下有效 |
-F | 當(dāng)虛擬機進(jìn)程對-dump選項沒有相應(yīng)時??墒褂眠@個選項強制生成dump快照。只在Linux/Solaris平臺下有效 |
提供jhat與jmap搭配使用,來分析dump生成的堆快照。jhat內(nèi)置了一個微型的HTTP/HTML服務(wù)器,生成dump文件的分析結(jié)果后,可以在瀏覽器中查看。
一般不會去直接使用jhat命令來分析demp文件:原因一是一般不會在部署應(yīng)用程序的服務(wù)器上直接分析dump文件,一般會盡量將dump文件拷貝到其他機器上進(jìn)行分析,因為分析工作是一個耗時且消耗硬件資源的過程,既然都要在其他機器上進(jìn)行,就沒必要受到命令行工具的限制了;另外一個原因是jhat的分析功能相對來說很簡陋,VisualVM以及專門分析dump文件的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都能實現(xiàn)比jhat更強大更專業(yè)的分析功能。
jhat [ options ] heap-dump-file
3.1.6 jstack:java棧跟蹤工具jstack命令用于生成虛擬機當(dāng)前時刻的線程快照。
線程快照就是當(dāng)前虛擬機內(nèi)每一條線程正在執(zhí)行的方法堆棧集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程死鎖、死循環(huán)、請求外部資源導(dǎo)致長時間等待等。
jstack [option] vmid
選項 | 作用 |
---|---|
-F | 當(dāng)正常輸出的請求不被響應(yīng)時,強制輸出線程堆棧 |
-l | 除堆棧外,顯示關(guān)于鎖的附加信息 |
-m | 如果調(diào)用到本地方法的話,可以顯示c/c++的堆棧 |
JConsole ( Java Monitoring and Management Console ) 是—種基于JMX的可視化監(jiān)視管理工具。它管理部分的功能是針對JMX MBean進(jìn)行管理,由于MBean可以使用代碼、中間件服務(wù)器的管理控制臺或者所有符合JMX規(guī)范的軟件進(jìn)行訪問。
“概述”頁簽顯示的是整個虛擬機主要運行數(shù)據(jù)的概覽,其中包括“堆內(nèi)存使用情況”、“線程”、“類”、“CPU使用情況”4種信息的曲線圖
“內(nèi)存”頁簽相當(dāng)于可視化的jstat命令,用于監(jiān)視受收集器管理的虛擬機內(nèi)存(Java堆和永久代)的變化趨勢。
“線程”頁簽的功能相當(dāng)于可視化的jstack命令,遇到線程停頓時可以使用這個頁簽進(jìn)行監(jiān)控分析。
3.3 VisualVM:可視化工具VisualVM(All-in-One Java Troubleshooting Tool)是到目前為止隨JDK發(fā)布的功能最強大的運行監(jiān)視和故障處理程序,并且可以預(yù)見在未來一段時間內(nèi)都是官方主力發(fā)展的虛擬機故障處理工具。官方在VisualVM的軟件說明中寫上了“All-in-One” 的描述字樣,預(yù)示著它除了運行監(jiān)視、故障處理外,還提供了很多其他方面的功能。如性能分析,VisualVM的性能分析功能甚至比起JProfiler、YourKit等專業(yè)且收費的Profiling工具都不會遜色多少,而且VisualVM的還有一個很大的優(yōu)點:不需要被監(jiān)視的程序基于特殊Agent運行,因此它對應(yīng)用程序的實際性能的影響很小,使得它可以直接應(yīng)用在生產(chǎn)環(huán)境中。這個優(yōu)點是JProfiler、YourKit等工具無法與之媲美的。
VisualVM基于NetBeans平臺開發(fā),因此它一開始就具備了插件擴展功能的特性,通過插件擴展支持,VisualVM可以做到:
顯示虛擬機進(jìn)程以及進(jìn)程的配置、環(huán)境信息(jps、 jinfo)。
監(jiān)視應(yīng)用程序的CPU、GC、堆、方法區(qū)以及線程的信息(jstat、jstack)。
dump以及分析堆轉(zhuǎn)儲快照(jmap、jhat)。
方法級的程序運行性能分析,找出被調(diào)用最多、運行時間最長的方法。
離線程序快照:收集程序的運行時配置、線程dump、內(nèi)存dump等信息建立個快照, 可以將快照發(fā)送開發(fā)者處進(jìn)行Bug反饋。
在VisualVM中生成dump文件有兩種方式,可以執(zhí)行下列任一操作:
在“應(yīng)用程序”窗口中右鍵單擊應(yīng)用程序節(jié)點,然后選擇“堆Dump”。
在“應(yīng)用程序”窗口中雙擊應(yīng)用程序節(jié)點以打開應(yīng)用程序標(biāo)簽,然后在“監(jiān)視”標(biāo)簽中單擊“堆Dump”。
在Profiler頁簽中,VisualVM提供了程序運行期間方法級的CPU執(zhí)行時間分析以及內(nèi)存分析,做Profiling分析肯定會對程序運行性能有比較大的影響,所以一般不在生產(chǎn)環(huán)境中使用這項功能。
BTrace本身也是可以獨立運行的程序。它的作用是在不停止目標(biāo)程序運行的前提下,通過HotSpot虛擬機的HotSwap技術(shù)動態(tài)加入原本并不存在的調(diào)試代碼。這項功能對實際生產(chǎn)中的程序很有意義:經(jīng)常遇到程序出現(xiàn)問題,但排查錯誤的一些必要信息,譬如方法參數(shù)、返回值等,在開發(fā)時并沒有打印到日志之中,以至于不得不停掉服務(wù),通過調(diào)試增量來加入日志代碼以解決問題。當(dāng)遇到生產(chǎn)環(huán)境服務(wù)無法隨便停止時,缺一兩句日志導(dǎo)致排錯進(jìn)行不下去是一件非常郁悶的事情。BTrace的用法還有許多,打印調(diào)用堆棧、參數(shù)、返回值只是最基本的應(yīng)用,在它的網(wǎng)站上有使用BTrace進(jìn)行性能監(jiān)視、定位連接泄漏和內(nèi)存泄漏、解決多線程競爭問題的例子。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72763.html
摘要:監(jiān)控和故障處理工具顯示指定系統(tǒng)內(nèi)所有的虛擬機進(jìn)程用于收集虛擬機各方面的運行數(shù)據(jù)。的常用功能選項測試上面輸出了我正在運行程序的包名下的類名虛擬機統(tǒng)計信息監(jiān)視工具使用于監(jiān)視虛擬機各種運行狀態(tài)信息的命令行工具。 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第二版》讀書筆記與常見面試題總結(jié) 本節(jié)常見面試題(推薦帶著問題閱讀,問題答案在文中都有提到): JVM調(diào)優(yōu)的常見命令行工具有哪些?...
摘要:然而偶爾的一次聚會,你聽說和自己一起出道的同學(xué)早已經(jīng)年薪萬,而自己卻囊中羞澀。這個時候,你可能會懷疑自己的能力,也痛恨為什么當(dāng)初自己沒有好好復(fù)習(xí)。 作為一個 Java 程序員,我們深知水平的深淺決定你的收入高低,月工資下到七八千,上到十幾萬都是很正常的事情。許多人的現(xiàn)狀是平時總是陷在業(yè)務(wù)開發(fā)...
摘要:可現(xiàn)在五年過去了,他想跳槽卻鮮有人問津。最可氣的是比他晚一年畢業(yè)的學(xué)弟,勤勤懇懇在一家中型互聯(lián)網(wǎng)企業(yè)干了年,現(xiàn)在已經(jīng)跳槽到了阿里,月薪是我這個同學(xué)的倍。 我有個同學(xué)大學(xué)畢業(yè),因為卻少工作經(jīng)驗,又不愿意去正經(jīng)的互聯(lián)網(wǎng)企業(yè)做實習(xí)生,他嫌工資太低,于是進(jìn)了家外包公司,那時候感覺待遇還可以??涩F(xiàn)在五...
摘要:接私活對程序員這個圈子來說是一個既公開又隱私的話題,不說全部,應(yīng)該大多數(shù)程序員都有過想要接私活的想法,當(dāng)然,也有部分得道成仙的不主張接私活。 接私活 對程序員這個圈子來說是一個既公開又隱私的話題,不說全部,應(yīng)該大多數(shù)程序員都有過想要接私活的想法,當(dāng)然,也有部分得道成仙的不主張接私活。但是很少...
摘要:同時也會關(guān)注市場上同崗位薪資,以便對企業(yè)內(nèi)部薪資結(jié)構(gòu)做出相應(yīng)調(diào)整。一般來說,相同崗位和職責(zé)的員工,薪資低于市場不超過,都屬于合理范疇,因為一個員工不會為了的薪酬而跳槽。同時,還能激勵員工自我提升,以獲得相應(yīng)技能市場所給予的報酬。 各位職場人都聽說過薪資倒掛這詞兒吧,這個情況在行業(yè)內(nèi)早就不是什...
閱讀 2187·2021-09-22 16:05
閱讀 9521·2021-09-22 15:03
閱讀 2946·2019-08-30 15:53
閱讀 1765·2019-08-29 11:15
閱讀 975·2019-08-26 13:52
閱讀 2433·2019-08-26 11:32
閱讀 1874·2019-08-26 10:38
閱讀 2639·2019-08-23 17:19