第四章 虛擬機(jī)性能監(jiān)控與排障
時(shí)間:2023-06-28 02:21:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-06-28 02:21:01 來源:網(wǎng)站運(yùn)營
第四章 虛擬機(jī)性能監(jiān)控與排障:
將來的你,一定會(huì)感謝現(xiàn)在拼命的自己。
一、概述
實(shí)際工作中從實(shí)踐的角度給一個(gè)系統(tǒng)定位問題的時(shí)候,知識(shí)、經(jīng)驗(yàn)是關(guān)鍵基礎(chǔ),數(shù)據(jù)是依據(jù),工具是運(yùn)用知識(shí)處理數(shù)據(jù)的手段。
這里說的數(shù)據(jù)包括:
- 運(yùn)行日志
- 異常堆棧
- GC日志
- 線程快照( threaddump/javacore 文件)
- 堆轉(zhuǎn)儲(chǔ)快照(heapdump/hprof文件)等
經(jīng)常使用適當(dāng)?shù)奶摂M機(jī)監(jiān)控和分析的工具可以加快我們分析數(shù)據(jù)、定位解決問題的速度,但在學(xué)習(xí)工具前,也應(yīng)當(dāng)意識(shí)到工具永遠(yuǎn)都是知識(shí)技能的一層包裝,沒有什么工具是“秘密武器”,不可能學(xué)會(huì)了就能包治百病。
二、JDK的命令行工具
Java開發(fā)人員肯定都知道 JDK的 bin 目錄中有“java.exe”、“javac.exe”這兩個(gè)命令行工具。每逢JDK更新版本之時(shí),bin目錄下命令行工具的數(shù)量和功能總會(huì)不知不覺地增加和增強(qiáng)。這些工具都非常穩(wěn)定而且功能強(qiáng)大,能在處理應(yīng)用程序性能問題、定位故障時(shí)發(fā)揮作用。
- JDK的這些工具的程序體積都異常小巧,幾乎所有工具的體積基本上都穩(wěn)定在 27KB左右。
- 這些命令行工具大多數(shù)是jdk/lib/tools.jar類庫的一層薄包裝而已,它們主要的功能代碼是在tools 類庫中實(shí)現(xiàn)的
- 這些工具中很多甚至就是由 Shell 腳本直接寫成的,可以用vim 直接打開它們。
JDK 開發(fā)團(tuán)隊(duì)選擇采用 Java 代碼來實(shí)現(xiàn)這些監(jiān)控工具是有特別用意的:當(dāng)應(yīng)用程序部署的生產(chǎn)環(huán)境后,無論是直接接觸物理服務(wù)器還是遠(yuǎn)程Telnet 到服務(wù)器上都可能會(huì)受到限制 toolsjar 類庫里面的接口,我們可以直接在應(yīng)用程序中實(shí)現(xiàn)功能強(qiáng)大的監(jiān)控分析功能。
使用細(xì)節(jié)可以針對性網(wǎng)上搜索,先構(gòu)建知識(shí)框架?。?!
1.jps:虛擬機(jī)進(jìn)程狀況工具
命令格式:jps [options ] [ hostid ]
我們可以使用 jps -help 查看具體用法
- -q:只輸出進(jìn)程 ID
- -m:輸出傳入 main 方法的參數(shù)
- -l:輸出完全的包名,應(yīng)用主類名,jar的完全路徑名
- -v:輸出jvm參數(shù)
- -V:輸出通過flag文件傳遞到JVM中的參數(shù)
2.jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具
命令格式:jstat [ option vmid [interval [s|ms] [count] ] ]
我們可以使用 jstat -help 查看具體用法
- -gc 監(jiān)視Java堆狀況,包括Eden區(qū)、2個(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 顯示新生代統(tǒng)計(jì)信息
- -gcnewcapacity 統(tǒng)計(jì)新生代及內(nèi)存使用情況,輸出主要關(guān)注使用到的最大、最小空間
- -gcold 統(tǒng)計(jì)老年代和元空間使用情況
- -gcoldcapacity 統(tǒng)計(jì)老年代內(nèi)存使用情況,輸出主要關(guān)注使用到的最大、最小空間
- -gcmetacapacity 統(tǒng)計(jì)元空間使用情況
- -printcompilation 輸出已經(jīng)被及時(shí)編譯的方法
- -compiler 輸出及時(shí)編譯器編譯過的方法、耗時(shí)等信息
- -class 監(jiān)視類加載、卸載數(shù)量、總空間以及類裝載所耗時(shí)間
- -gcpermcapacity 輸出永久代的最大、最小空間 (JDK1.8已經(jīng)完全移除永久代)
3.jinfo:Java配置信息工具
命令格式:jinfo [ option ] pid
我們可以使用 jinfo -help 查看具體用法
- -flag name 打印給定參數(shù)的鍵值對。
- -flag [+|-]name 使給定的命令行參數(shù)可用或不可用。
- -flag name=value 設(shè)置給定的命令行參數(shù)的值為指定的值。
- -flags 打印傳遞給 JVM 的參數(shù)。
- -sysprops 打印以鍵值對表示的 Java 系統(tǒng)屬性。
- -h, -help 打印幫助信息
4.jmap:Java內(nèi)存映射工具
命令格式 jmap [ option] vmid
我們可以用jmap -help 查看具體用法
- dump 生成Java堆轉(zhuǎn)儲(chǔ)快照。
- finalizerinfo 顯示在F-Queue中等待Finalizer線程執(zhí)行finalize方法的對象,只在Linux/Solaris平臺(tái)下有效。
- heap 顯示Java堆詳細(xì)信息,如使用哪種回收器、參數(shù)配置 、分代狀況等。只在linux/Solaris平臺(tái)下有效。
- histo 顯示堆中對象統(tǒng)計(jì)信息,包括類、實(shí)例數(shù)量、合計(jì)容量。
- permstat 以ClassLoader為統(tǒng)計(jì)口徑顯示永久代內(nèi)存狀態(tài),只在Linux/Solaris平臺(tái)下有效。
- F 當(dāng)虛擬機(jī)進(jìn)程對-dump選項(xiàng)沒有響應(yīng)時(shí),可使用這個(gè)選項(xiàng)強(qiáng)制生成dump快照,只在Linux/Solaris平臺(tái)下有效。
5.jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具
命令格式 jhat [options] heap-dump-file
我們可以用jhat -help 查看具體用法
- J< flag > 因?yàn)?jhat 命令實(shí)際上會(huì)啟動(dòng)一個(gè)JVM來執(zhí)行, 通過 -J 可以在啟動(dòng)JVM時(shí)傳入一些啟動(dòng)參數(shù).
- -stack false true
- -refs false true
- -port port-number 設(shè)置 jhat HTTP server 的端口號(hào). 默認(rèn)值 7000。
- -exclude exclude-file 指定對象查詢時(shí)需要排除的數(shù)據(jù)成員列表文件。
- -baseline exclude-file 指定一個(gè)基準(zhǔn)堆轉(zhuǎn)儲(chǔ)(baseline heap dump)。
- -debug int 設(shè)置 debug 級(jí)別. 0 表示不輸出調(diào)試信息。 值越大則表示輸出更詳細(xì)的 debug 信息。
- -version 啟動(dòng)后只顯示版本信息就退出。
6.jstack:Java堆棧跟蹤工具
命令格式 jstack [-l] pid
我們可以用jstack:-help 查看具體用法
- -F當(dāng)正常輸出的請求不被響應(yīng)時(shí),強(qiáng)制輸出線程堆棧
- -l除堆棧外,顯示關(guān)于鎖的附加信息
- -m如果調(diào)用到本地方法的話,可以顯示C/C++堆棧
7.HSDIS:JIT生成代碼反匯編
HSDIS是sun推薦的HotSpot虛擬機(jī)JIT編譯代碼的反匯編插件,它包含在HotSpot虛擬機(jī)的源碼中,但沒有提供編譯后的程序。HotSpot的-XX:PrintAssemBly指令可以調(diào)用它來把本地代碼還原為匯編代碼輸出,同時(shí)還生成了一些注釋。
三、JDK可視化工具
- JConsole:Java監(jiān)視與管理 控制臺(tái)
- VisualVM:多合一故障處理工具
- 阿里的Arthas
- jprofile