JavaGuide知識(shí)點(diǎn)整理——JDK監(jiān)控和故障處理工具總結(jié)

JDK命令行工具

這些命令在JDK安裝目錄的bin目錄下:

  • jsp:類似UNIX的ps命令族展,用于查看所有java進(jìn)程的啟動(dòng)類缚陷。傳入?yún)?shù)和java虛擬機(jī)參數(shù)等信息达吞。
  • jstat:用于收集HotSpot虛擬機(jī)各方面的運(yùn)行數(shù)據(jù)培他。
  • jinfo:Configuration Info for Java,顯示虛擬機(jī)配置信息粉臊。
  • jmap:生成堆轉(zhuǎn)儲(chǔ)快照草添。
  • jhat:用于分析heapdump文件,它會(huì)建立一個(gè)HTTP/HTML服務(wù)器扼仲,讓用戶可以在瀏覽器上查看分析結(jié)果远寸。
  • jstack:生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照,線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合屠凶。

jps:查看所有java進(jìn)程

jps(JVM Process Status)命令類似UNIX的ps命令驰后、
jps:顯示虛擬機(jī)執(zhí)行主類名稱以及這些進(jìn)程的本地虛擬機(jī)唯一ID。
jps -q:只輸出進(jìn)程的本地虛擬機(jī)唯一ID.
jps -l:輸出主類的全名阅畴,如果進(jìn)程執(zhí)行的是jar包倡怎,輸出jar路徑。
jps -v:輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)JVM參數(shù)贱枣。
jps -m:輸出傳遞給java進(jìn)程main()函數(shù)的參數(shù)

jstat:監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息

jstat是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具监署。它可以顯示本地或者遠(yuǎn)程(需要遠(yuǎn)程主機(jī)提供RMI支持)虛擬機(jī)進(jìn)程中的類信息,內(nèi)存纽哥,垃圾收集钠乏,JIT編譯等運(yùn)行數(shù)據(jù)。在沒(méi)有GUI春塌,只提供了純文本控制臺(tái)環(huán)境的服務(wù)器上晓避,它將是運(yùn)行期間定位虛擬機(jī)性能問(wèn)題的首選工具。

jstat命令使用格式:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

比如如下命令:jstat -gc -h3 17188 1000 10
表示分析進(jìn)程id為 17188的gc情況只壳,每1000ms打印一次記錄俏拱,打印10次停止。每三行打印指標(biāo)頭部吼句。
效果如下:


jstat使用示例

當(dāng)然了實(shí)例中的-gc也可以換成別的锅必,常見(jiàn)的option如下:

  • jstat -class vmid:顯示ClassLoader的相關(guān)信息
  • jstat -compiler vmid:顯示JIT編譯相關(guān)的信息
  • jstat -gc vmid:顯示與GC相關(guān)的堆信息
  • jstat -gccapacity vmid:顯示各個(gè)代的容量以及使用信息
  • jstat -gcnew vmid:顯示新生代信息
  • jstat -gcnewcapacity vmid:顯示新生代大小和使用情況
  • jstat -gcold vmid:顯示老年代和永久代行為統(tǒng)計(jì)。不過(guò)1.8開始因?yàn)橛谰么灰瞥颂柩蓿灾伙@示老年代的行為統(tǒng)計(jì)了搞隐。
  • jstat -gcoldcapacity vmid:顯示老年代大小
  • jstat -gcpermcapacity vmid:顯示永久代大小。jdk1.8被移除了远搪。
  • jstat -gcutil vmid:顯示垃圾收集信息
    option使用demo

上述命令加上-t 參數(shù)可以在輸出信息上看到Timestamp列劣纲,顯示程序運(yùn)行時(shí)間。

jinfo:實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)

jinfo vmid : 輸出當(dāng)前jvm進(jìn)程的全部參數(shù)和系統(tǒng)屬性(第一部分是系統(tǒng)的屬性谁鳍,第二把部分是jvm的參數(shù))癞季。

jinfo -flag name vmid:輸出對(duì)應(yīng)名稱的參數(shù)的具體值劫瞳。比如輸出MaxHeapSize,查看這個(gè)當(dāng)前jvm進(jìn)程是否開始打印GC日志等。


jinfo使用demo

使用jinfo可以在不重啟虛擬機(jī)的情況下绷柒,動(dòng)態(tài)修改jvm參數(shù)柠新。尤其是線上的環(huán)境特別有用。
使用jinfo -flag +/- name vmid 可以開啟或者關(guān)閉對(duì)應(yīng)名稱的參數(shù)辉巡。之前我們看到是開啟了gc打印的,現(xiàn)在關(guān)閉一下:


修改jvm配置參數(shù)

jmap:生成堆轉(zhuǎn)儲(chǔ)快照

jmap命令用于生成堆轉(zhuǎn)儲(chǔ)快照蕊退。如果不使用jmap命令郊楣,想要獲取java堆轉(zhuǎn)儲(chǔ),可以使用“-XX:+HeapDumpOnOutOfMemoryError” 參數(shù)瓤荔【辉椋可以讓虛擬機(jī)在OOM異常出現(xiàn)之后自動(dòng)生成dump文件,linux命令下可以通過(guò)kill -3發(fā)送進(jìn)程退出信號(hào)也能拿到dump文件输硝。

jmap的作用不僅僅是為了獲取dump文件今瀑,他還可以查詢finalizer執(zhí)行隊(duì)列,java堆和永久代的詳細(xì)信息点把,如空間使用率橘荠,當(dāng)前使用的是哪種收集器等。和jinfo一樣郎逃,jmap有不少功能在windows平臺(tái)下也是受限制的哥童。

jhat:分析heapdump文件

jhat用于分析heapdump文件,它會(huì)建立一個(gè)HTTP/HTML服務(wù)器褒翰,讓用戶可以在瀏覽器上查看分析結(jié)果贮懈。

jstack:生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照

jstack命令用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照,線程快照就是當(dāng)前虛擬機(jī)每一條線程正在執(zhí)行的方法堆棧的集合优训。
生成線程快照的目的主要是定位線程長(zhǎng)時(shí)間出現(xiàn)停頓的原因朵你,如線程間死鎖,死循環(huán)揣非,請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等抡医。都是導(dǎo)致線程長(zhǎng)時(shí)間停頓的原因。線程出現(xiàn)停頓的時(shí)候通過(guò)jstack來(lái)查看各個(gè)線程的調(diào)用堆棧妆兑。就可以知道沒(méi)有響應(yīng)的線程到底在后臺(tái)做了些什么事魂拦,或者在等待什么資源。
下面是死鎖的demo:

public class Test {

    private static Object resource1 = new Object();//資源 1
    private static Object resource2 = new Object();//資源 2

    public static void main(String[] args){
            new Thread(() -> {
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread() + "waiting get resource2");
                    synchronized (resource2) {
                        System.out.println(Thread.currentThread() + "get resource2");
                    }
                }
            }, "線程 1").start();

            new Thread(() -> {
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread() + "waiting get resource1");
                    synchronized (resource1) {
                        System.out.println(Thread.currentThread() + "get resource1");
                    }
                }
            }, "線程 2").start();
        }

    
}

我們啟動(dòng)這個(gè)main方法后去控制臺(tái)查看(先用jps查看了死鎖的這個(gè)線程是18532):


jstack 18532

因?yàn)檫@個(gè)結(jié)果比較長(zhǎng)搁嗓,所以截圖截了最關(guān)鍵的部分芯勘。可以看到j(luò)stack已經(jīng)幫我們定位到了死鎖腺逛。

JDK可視化分析工具

JConsole:java監(jiān)視與管理控制臺(tái)

JConsole是基于jmx的可視化監(jiān)視荷愕,管理工具。可以很方便的監(jiān)視本地以及遠(yuǎn)程服務(wù)器的java進(jìn)程的內(nèi)存使用情況安疗。你可以在控制臺(tái)輸出console命令啟動(dòng)或者在JDK目錄的bin目錄找到j(luò)console.exe雙擊啟動(dòng)抛杨。


啟動(dòng)jconsole

選擇一個(gè)線程鏈接后就可以看到可視化頁(yè)面:


java程序概況

內(nèi)存監(jiān)控

JConsole可以顯示當(dāng)前內(nèi)存的詳細(xì)信息。不僅包括堆內(nèi)存/非堆內(nèi)存的整體信息荐类。還可以細(xì)化到Eden區(qū),Survivor區(qū)等的使用情況怖现,如下圖所示:


image.png

點(diǎn)擊右邊的執(zhí)行GC 按鈕可以強(qiáng)制應(yīng)用程序執(zhí)行一個(gè)full GC。

線程監(jiān)控

類似我們前面講的jstack命令玉罐,不過(guò)這個(gè)是可視化的屈嗤。
最下面有一個(gè)檢測(cè)死鎖的按鈕,點(diǎn)擊這個(gè)按鈕可以自動(dòng)為你找到發(fā)生死鎖的線程和詳細(xì)信息吊输。


找到了死鎖

Visual VM:多合一故障處理工具

VisualVM 提供在java虛擬機(jī)上運(yùn)行的java應(yīng)用程序的詳細(xì)信息饶号。在VisualVM的圖形用戶界面中,可以方便季蚂,快捷的查看多個(gè)java應(yīng)用程序的相關(guān)信息茫船。
Visual VM 官網(wǎng):https://visualvm.github.io/ 。Visual VM 中文文檔:https://visualvm.github.io/documentation.html扭屁。

VisualVM是到目前為止隨著JDK發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序算谈。官方在VisualVM的軟件說(shuō)明上寫了all in one的描述。預(yù)示著他除了運(yùn)行監(jiān)視料滥,故障處理外濒生,還提供了很多其他方面的功能,如性能分析幔欧。VisualVM的性能分析功能甚至比起JProfiler罪治,YourKit等專業(yè)且收費(fèi)的工具都不會(huì)遜色。而且VisualVM還有一個(gè)很大的優(yōu)點(diǎn):不需要被監(jiān)視的程序特殊 運(yùn)行礁蔗,因此他對(duì)于應(yīng)用程序的實(shí)際性能的影響很小觉义。使得他可以直接應(yīng)用在生產(chǎn)環(huán)境中。這個(gè)優(yōu)點(diǎn)是JProfiler浴井,YourKit等工具無(wú)法媲美的晒骇。

VisualVM基于NetBeans平臺(tái)開發(fā),因此一開始就具備了插件擴(kuò)展功能的特性磺浙。通過(guò)插件擴(kuò)展支持洪囤,VisualVM可以做到:

  • 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置,環(huán)境信息(jps,jinfo)
  • 監(jiān)視應(yīng)用程序的CPU,GC,堆撕氧,方法區(qū)以及線程的信息(jstat,jstack)
  • dump以及分析堆轉(zhuǎn)儲(chǔ)快照(jmap,jhat)
  • 方法級(jí)的程序運(yùn)行性能分析瘤缩,找到被調(diào)用最多,運(yùn)行時(shí)間最長(zhǎng)的方法伦泥。
  • 離線程序快照:收集程序的運(yùn)行時(shí)配置剥啤,線程dump锦溪,內(nèi)存dump等信息建立一個(gè)快照,可以將快照發(fā)送開發(fā)者處進(jìn)行bug反饋府怯。
  • 其他plugins的無(wú)限的可能性

這里就不介紹VisualVM了刻诊,想了解的自己去看官網(wǎng)。

本篇筆記就記到這里牺丙,如果稍微幫到你了記得點(diǎn)個(gè)喜歡點(diǎn)個(gè)關(guān)注则涯,也祝大家工作順順利利,每天都有所進(jìn)步冲簿!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末是整,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子民假,更是在濱河造成了極大的恐慌,老刑警劉巖龙优,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羊异,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡彤断,警方通過(guò)查閱死者的電腦和手機(jī)野舶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宰衙,“玉大人平道,你說(shuō)我怎么就攤上這事」┝叮” “怎么了一屋?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)袋哼。 經(jīng)常有香客問(wèn)我冀墨,道長(zhǎng),這世上最難降的妖魔是什么涛贯? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任诽嘉,我火速辦了婚禮,結(jié)果婚禮上弟翘,老公的妹妹穿的比我還像新娘虫腋。我一直安慰自己,他們只是感情好稀余,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布悦冀。 她就那樣靜靜地躺著,像睡著了一般睛琳。 火紅的嫁衣襯著肌膚如雪雏门。 梳的紋絲不亂的頭發(fā)上嘿歌,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音茁影,去河邊找鬼宙帝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛募闲,可吹牛的內(nèi)容都是我干的步脓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浩螺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼靴患!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起要出,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸳君,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后患蹂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體或颊,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年传于,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囱挑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沼溜,死狀恐怖平挑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情系草,我是刑警寧澤通熄,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站找都,受9級(jí)特大地震影響棠隐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檐嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一助泽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嚎京,春花似錦嗡贺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至帕涌,卻和暖如春摄凡,著一層夾襖步出監(jiān)牢的瞬間续徽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工亲澡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钦扭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓床绪,卻偏偏與公主長(zhǎng)得像客情,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子癞己,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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