JDK自帶的性能調(diào)優(yōu)監(jiān)測(cè)工具使用示例

JVM性能調(diào)優(yōu)監(jiān)控工具jps、jstack、jmap、jhat、jstat位于JDK的bin目錄,這些工具短小精悍,常用于線上系統(tǒng)的分析監(jiān)測(cè)。

用來解決如下問題

  1. OutOfMemoryError,分析內(nèi)存不足的原因
  2. 內(nèi)存泄漏
  3. 線程死鎖
  4. 鎖競(jìng)爭(zhēng)
  5. java線程消耗CPU過高

jps(Java Virtual Machine Process Status Tool)

JVM 進(jìn)程狀態(tài)工具,主要用來輸出JVM中運(yùn)行的進(jìn)程狀態(tài)信息

語法格式:


演示如下:




打印多項(xiàng)


jstack(java stack trace)

用來查看某個(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)來判斷系統(tǒng)是否存在死鎖、過度競(jìng)爭(zhēng)等問題。

語法格式:

演示:
步驟1:top 命令查看按CPU使用率降序進(jìn)程ID


其實(shí)整個(gè)系統(tǒng)比較閑,拿來做實(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命令分析線程棧信息

  1. jstack -l pid 查看某一JVM進(jìn)程的所有線程的信息


利用linux輸出重定向,將線程信息輸入到pid12622.dump文件中
然后使用more命令查看此文件

部分信息,以后對(duì)這個(gè)dump文件信息進(jìn)行解析

http://blog.csdn.net/rachel_luo/article/details/8920596

  1. 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è)工具, 常用來實(shí)時(shí)監(jiān)測(cè)系統(tǒng)堆的使用情況,以及GC信息、編譯信息、類加載信息,常用來判斷系統(tǒng)JVM參數(shù)是否設(shè)置合理,作為系統(tǒng)參數(shù)調(diào)優(yōu)的信息統(tǒng)計(jì)工具

語法:

根據(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用來查看堆內(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來分析


分析內(nèi)存快照

jhat [file]

分析內(nèi)存占用,對(duì)象引用關(guān)系等, J-Xmx1024意思是將最大堆參數(shù)-Xmx1024傳遞給啟動(dòng)jhat分析的JVM進(jìn)程的。




通過瀏覽器訪問 http:ip:7000地址,進(jìn)行分析



首頁按包進(jìn)行分組,有全限定類名和此類加載到永久代的堆地址

點(diǎn)擊鏈接查看指定類的的加載信息,繼承信息,數(shù)據(jù)域、引用信息,以及創(chuàng)建的對(duì)象實(shí)例信息

本文參考如下鏈接,只是對(duì)這些工具的總結(jié)筆記

參考以及拓展鏈接
R大(莫樞)借HSDB來探索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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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