4.1概述
定位問題员凝,知識、經(jīng)驗是關(guān)鍵基礎(chǔ)奋献,數(shù)據(jù)是依據(jù)健霹,工具是運用知識處理數(shù)據(jù)的手段
數(shù)據(jù)包含:運行日志旺上、異常堆棧、GC日志糖埋、線程快照(threaddump/javacore文件)宣吱、堆轉(zhuǎn)儲快照(heapdump/hprof文件)
jdk的bin路徑下用于監(jiān)視虛擬機和故障處理的工具
工具都特別小,是jdk/lib/tools.jar的包裝
借助tools.jar接口瞳别,在程序中實現(xiàn)強大的監(jiān)控分析功能
4.2JDK命令行工具
4.2.1jps(JVM process status tool)
虛擬機進(jìn)程狀況工具
列出虛擬機進(jìn)程征候、顯示虛擬機執(zhí)行主類名稱、這些進(jìn)程的本地虛擬機唯一ID(local virtual machine identifier)
對于本地虛擬機祟敛,LVMID和進(jìn)程ID(Process identifier疤坝,PID)一致
如果同時啟動多個虛擬機,無法根據(jù)進(jìn)程名稱定位垒棋,就需要依賴jps的查看主類的功能才能區(qū)分
工具選項說明
q:只顯示LVMID卒煞,省略主類的名稱
m:輸出虛擬機啟動時傳遞給主類main()函數(shù)的參數(shù)
l:輸出主類的全名,如果進(jìn)程執(zhí)行的是jar包叼架,輸出jar路徑
v:輸出虛擬機進(jìn)程啟動時JVM參數(shù)
4.2.2jstat(JVM statistics monitoring tool)
虛擬機統(tǒng)計信息監(jiān)視工具
用于監(jiān)視虛擬機各種運行狀態(tài)信息
顯示本地或遠(yuǎn)程虛擬機進(jìn)程中類裝載畔裕、內(nèi)存、垃圾收集乖订、JIT編譯的動態(tài)數(shù)據(jù)
對于本地虛擬機進(jìn)程扮饶,VMID和LVMID一致
對于遠(yuǎn)程虛擬機,VMID格式為[protocol:][//] lvmid [@hostname:[port]/servername]
interval和count代表運行的間隔和次數(shù)
option代表希望查詢的虛擬機信息乍构,主要分為類裝載甜无、垃圾收集、運行期編譯狀況
工具選項說明
-class:監(jiān)視類裝載哥遮、卸載數(shù)量岂丘、總空間以及類裝載耗費的時間
-gc:監(jiān)視java堆狀況,包含Eden區(qū)眠饮、兩個survivor區(qū)奥帘、老年代、永久帶的容量仪召、已用空間寨蹋、GC時間合計信息等
-gccapacity:監(jiān)視內(nèi)容和-gc基本相同,輸出主要關(guān)注各個區(qū)域使用到的最大扔茅、最小空間
-gcutil:監(jiān)視內(nèi)容和-gc基本相同已旧,輸出主要關(guān)注已用空間的占比
-gccause:和gcutil一樣,會額外輸出導(dǎo)致上一次gc的原因
-gcnew:監(jiān)視新生代gc狀況
-gcnewcapacity:和-gcnew基本相同召娜,主要關(guān)注使用到的最大运褪、最小空間
-gcold:監(jiān)視老年代gc狀況
-gcoldcapacity:和-gcold基本相同,主要關(guān)注使用到的最大、最小空間
-gcpermcapacity:輸出永久代使用的最大秸讹、最小空間
-compiler:輸出JIT編譯器編譯過的方法胁后、耗時等信息
-printcompilation:輸出已經(jīng)被JIT編譯過的方法
4.2.3jinfo(Configuration info for java)
java配置信息工具
實時的查看和調(diào)整虛擬機參數(shù)
查看虛擬機啟動時未被顯式指定的系統(tǒng)默認(rèn)值,用jinfo的-flag
4.2.4jmap(Memory map for java)
Java內(nèi)存映像工具
生成堆轉(zhuǎn)儲快照(一般稱為heapdump或dump文件)
查詢finalize執(zhí)行隊列
java堆和永久代的詳細(xì)信息嗦枢,如空間使用率攀芯、當(dāng)前用的哪種收集器
工具選項說明
4.2.5jhat(JVM heap analysis Tool)
java堆轉(zhuǎn)儲快照分析工具
jhat內(nèi)置微型http/html服務(wù)器,生成dump文件的分析結(jié)果后文虏,可以在瀏覽器查看
一般不會直接用jhat命令分析dump
一般不會直接在部署的服務(wù)器上直接分析dump文件侣诺,分析耗時、消耗硬件資源
分析功能比較簡陋
一般用virtualVM氧秘、Eclipse Memory analyzer年鸳、IBM HeapAnalyzer
4.2.6jstack(Stack Trace for java)
java堆棧跟蹤工具
生成虛擬機當(dāng)前時刻的線程快照(一般稱為threaddump或者javacore文件)
線程快照就是每一個線程執(zhí)行的方法堆棧的集合
定位線程長時間停頓的原因,如線程死鎖丸相、死循環(huán)搔确、請求外部資源導(dǎo)致的長時間等待
工具選項說明
4.2.7hsdis:JIT生成代碼反匯編
作用是讓Hotspot的-XX:printAssembly指令調(diào)用它來把動態(tài)生成的的本地代碼還原為匯編代碼輸出,同時生成大量有價值的注釋
4.3JDK的可視化工具
4.3.1Jconsole:java監(jiān)視與管理控制臺
一款基于JMX的可視化監(jiān)視灭忠、管理工具
管理部分的功能是針對JMX Mbean進(jìn)行管理
Mbean可以通過代碼膳算、中間服務(wù)器的管理控制臺、或所有符合JMX規(guī)范的軟件訪問
監(jiān)視
1啟動:JDK/bin下的jconsole.exe,自動搜索虛擬機進(jìn)程弛作,不需要jps來查詢
2.內(nèi)存監(jiān)控:相當(dāng)于可視化的jstat涕蜂,用于監(jiān)視受收集器管理的虛擬機內(nèi)存(Java堆和永久代)的變化趨勢
3線程監(jiān)控:相當(dāng)于可視化的jstack,查看線程停頓的原因映琳,例如等待外部資源机隙、死循環(huán)、鎖等待
4.3.2:virtualVM:多合一故障處理
All-in-one java troubleshooting tool
運行監(jiān)視萨西、故障處理有鹿、性能分析
兼容范圍與插件安裝
通過插件擴展,virtualVM可以做到功能
顯示虛擬機的進(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等信息建立一個快照
其他plugin無限可能性...
生成屑彻、瀏覽堆轉(zhuǎn)儲快照
分析程序性能
做profiling分析對程序性能影響較大验庙,在生產(chǎn)環(huán)境一般不會用這些功能
BTrace動態(tài)日志跟蹤
在不停止目標(biāo)程序的前提下,通過Hotspot虛擬機的HotSwap技術(shù)動態(tài)加入原本并不存在的調(diào)試代碼
HotSwap技術(shù):代碼熱替換技術(shù)社牲,HotSpot虛擬機允許在不停止運行的情況下粪薛,更新已經(jīng)加載的類的代碼
參考文獻(xiàn):
[1] 深入理解Java虛擬機 第二版 --周志明