JVM性能調(diào)優(yōu)監(jiān)控工具jps脓钾、jstack、jmap旅择、jhat惭笑、jstat位于JDK的bin目錄,這些工具短小精悍生真,常用于線上系統(tǒng)的分析監(jiān)測(cè)沉噩。
用來(lái)解決如下問題
- OutOfMemoryError,分析內(nèi)存不足的原因
- 內(nèi)存泄漏
- 線程死鎖
- 鎖競(jìng)爭(zhēng)
- java線程消耗CPU過高
jps(Java Virtual Machine Process Status Tool)
JVM 進(jìn)程狀態(tài)工具柱蟀,主要用來(lái)輸出JVM中運(yùn)行的進(jìn)程狀態(tài)信息
語(yǔ)法格式:
演示如下:
打印多項(xiàng)
jstack(java stack trace)
用來(lái)查看某個(gè)Java進(jìn)程內(nèi)的線程堆棧信息川蒙,實(shí)時(shí)監(jiān)測(cè)系統(tǒng)運(yùn)行時(shí)線程棧信息,而不用暫停程序排查长已,常用于線上系統(tǒng)的問題排查畜眨,一般都是間隔一段時(shí)間使用jstack命令打印出當(dāng)前系統(tǒng)實(shí)時(shí)快照,然后比對(duì)線程在在鎖上的執(zhí)行狀態(tài)來(lái)判斷系統(tǒng)是否存在死鎖术瓮、過度競(jìng)爭(zhēng)等問題康聂。
語(yǔ)法格式:
演示:
步驟1:top 命令查看按CPU使用率降序進(jìn)程ID
其實(shí)整個(gè)系統(tǒng)比較閑,拿來(lái)做實(shí)驗(yàn)胞四,最占CPU的是進(jìn)程ID為12622的進(jìn)程恬汁。
步驟2 :top -Hp pid 命令查看進(jìn)程中各個(gè)線程占用CPU的情況。
可見最占CPU的是ID為13037的線程
與top -Hp pid等價(jià)的命令:ps -Lfp pid或者ps -mp pid -o THREAD, tid, time辜伟。
步驟3:printf "%x\n" 13037 獲取16進(jìn)制nid
將十進(jìn)制13037 轉(zhuǎn)換為16進(jìn)制為32ed
步驟4:使用jstack命令分析線程棧信息
- jstack -l pid 查看某一JVM進(jìn)程的所有線程的信息
利用linux輸出重定向氓侧,將線程信息輸入到pid12622.dump文件中
然后使用more命令查看此文件
部分信息脊另,以后對(duì)這個(gè)dump文件信息進(jìn)行解析
http://blog.csdn.net/rachel_luo/article/details/8920596
- jstack -l pid | grep nid查看某一JVM進(jìn)程的指定線程的信息
利用Linux所提供的管道符“|”將兩個(gè)命令隔開,管道符左邊命令的輸出就會(huì)作為管道符右邊命令的輸入约巷。連續(xù)使用管道意味著第一個(gè)命令的輸出會(huì)作為第二個(gè)命令的輸入偎痛,第二個(gè)命令的輸出又會(huì)作為第三個(gè)命令的輸入,依此類推独郎,grep是支持正則表達(dá)式的實(shí)用文本搜索工具踩麦。
jstat(Java Virtual Machine Statistics Monitoring Tool)
JVM統(tǒng)計(jì)監(jiān)測(cè)工具, 常用來(lái)實(shí)時(shí)監(jiān)測(cè)系統(tǒng)堆的使用情況,以及GC信息囚聚、編譯信息靖榕、類加載信息,常用來(lái)判斷系統(tǒng)JVM參數(shù)是否設(shè)置合理顽铸,作為系統(tǒng)參數(shù)調(diào)優(yōu)的信息統(tǒng)計(jì)工具茁计。
語(yǔ)法:
根據(jù)jstat統(tǒng)計(jì)的維度不同,可以使用如下表中的選項(xiàng)進(jìn)行不同維度的統(tǒng)計(jì)谓松,不同的操作系統(tǒng)支持的選項(xiàng)可能會(huì)不一樣星压,可以通過-options選項(xiàng),查看不同操作系統(tǒng)所支持選項(xiàng)鬼譬。
jstat -option獲取系統(tǒng)支持的選項(xiàng)
選項(xiàng)說明
演示
列名信息參考 http://blog.csdn.net/fenglibing/article/details/6411951
JVM堆內(nèi)存布局(JDK1.7及之前娜膘,JDK1.8已經(jīng)移除永久代i,而使用元數(shù)據(jù)优质,元數(shù)據(jù)屬于堆外內(nèi)存竣贪,但是也間接被GC管理)
說明:
jmap(Memory Map)和jhat(Java Heap Analysis Tool)
jmap用來(lái)查看堆內(nèi)存(JVM中各個(gè)代的內(nèi)存情況,對(duì)象占用情況)使用狀況巩螃,還可以導(dǎo)出整個(gè)JVM的內(nèi)存信息演怎,一般結(jié)合jhat使用。
常用命令格式(注意64位JDK避乏,需要加每條命令要加 -J-d64):
jmap -heap [pid] 查看整個(gè)JVM中內(nèi)存使用情況(還含有JDK版本爷耀,GC策略相關(guān)等)。
需要注意當(dāng)使用CMS GC時(shí) jmap -heap命令可能導(dǎo)致Java進(jìn)程被掛起
jmap -histo [pid]
查看JVM堆中存活對(duì)象的詳細(xì)使用情況,常用于分析OutOfMemory
jmap -dump:format=b, file=fileName [pid]
將整個(gè)JVM內(nèi)存信息以二進(jìn)制的形式導(dǎo)出到指定文件,這個(gè)二進(jìn)制文件可以通過JHAT來(lái)分析
分析內(nèi)存快照
jhat [file]
分析內(nèi)存占用包颁,對(duì)象引用關(guān)系等, J-Xmx1024意思是將最大堆參數(shù)-Xmx1024傳遞給啟動(dòng)jhat分析的JVM進(jìn)程的咆耿。
通過瀏覽器訪問 http:ip:7000地址,進(jìn)行分析
首頁(yè)按包進(jìn)行分組爹橱,有全限定類名和此類加載到永久代的堆地址
點(diǎn)擊鏈接查看指定類的的加載信息票灰,繼承信息,數(shù)據(jù)域、引用信息屑迂,以及創(chuàng)建的對(duì)象實(shí)例信息
本文參考如下鏈接,只是對(duì)這些工具的總結(jié)筆記
參考以及拓展鏈接
R大(莫樞)借HSDB來(lái)探索HotSpot VM的運(yùn)行時(shí)數(shù)據(jù)
Thread dump 分析綜述
http://blog.csdn.net/fenglibing/article/details/6411940
http://www.open-open.com/lib/view/open1390916852007.html
http://blog.csdn.net/qq_16811963/article/details/52997178