面試常被問(wèn)到的 JDK 命令,你知道幾個(gè)?
Hello 大家好,我是鴨血粉絲,不知道你有沒(méi)有過(guò)這樣的經(jīng)歷,經(jīng)常在面試的時(shí)候被問(wèn)到 JDK 相關(guān)的命令,如何排查線上的問(wèn)題,線上程序突然崩了要怎么處理,等等類似這種場(chǎng)景。其實(shí)并不是每個(gè)開發(fā)人員都能有這種實(shí)戰(zhàn)經(jīng)驗(yàn),現(xiàn)實(shí)工作中往往很多開發(fā)人員是接觸不到線上環(huán)境的。但是作為一個(gè)以 Java 謀生的程序員,如果連這些 JDK 自帶的一些命令都不知道,那也說(shuō)不過(guò)去。
阿粉以前也是這樣,從來(lái)沒(méi)有接觸過(guò)線上環(huán)境,有任何問(wèn)題都是運(yùn)維人員去處理,因?yàn)橄嚓P(guān)制度不允許開發(fā)人員接觸生產(chǎn)服務(wù)器。但是作為一個(gè)有夢(mèng)想的開發(fā)人員,不能接觸不代表就不用學(xué),阿粉還是私下好好學(xué)習(xí)了一波,萬(wàn)一哪天就用上了呢。
JDK 常用命令
先給大家看一張總覽圖,然后我們一個(gè)個(gè)命令去使用一下,感受一下。
JPS
說(shuō)明:首先通過(guò)上圖,我們看到使用 jps 或者 jps | grep -v Jps 命令的時(shí)候是可以找到當(dāng)前系統(tǒng)所有JVM。上面第二條命令是過(guò)濾本身的 Jps 程序。可以看到,輸入這個(gè)命令后,會(huì)展示出當(dāng)前系統(tǒng)所有的 Java 程序,并且會(huì)輸出進(jìn)程號(hào) pid(也就是前面的數(shù)字)。
我們通過(guò)命令 man jps 簡(jiǎn)單的看下說(shuō)明,如下:
可以看到 jps 命令有五個(gè)參數(shù),每個(gè)參數(shù)的含義如下,
- -q: 不輸出類名信息和參數(shù),只輸出進(jìn)程號(hào)
- -m:展示輸入到 main 方法的參數(shù)
- -l:展示 main class 全路徑
- -v:展示輸入 JVM 的參數(shù)
- -V:不輸出路徑,只輸出進(jìn)程號(hào)和jar
我們依次輸入試下,如下圖
Jinfo
通過(guò)上一步我們可以獲得對(duì)應(yīng) JVM 的進(jìn)程號(hào),這為我們后續(xù)的操作提供了便利,后續(xù)的操作都會(huì)使用到進(jìn)程號(hào)。
我們先使用一下命令,在使用前我們先獲取進(jìn)程號(hào),我這里服務(wù)器運(yùn)行的進(jìn)程號(hào)為 2528,然后輸入jinof 2528
通過(guò)上圖,我們看到當(dāng)前 JVM 的版本以及其他詳細(xì)信息,并且可以看到服務(wù)器以及環(huán)境變量等一系列信息。同樣的我們使用 man jinfo 命令看下手冊(cè)。
該命令主要是用戶查看當(dāng)前虛擬機(jī)相關(guān)信息,我們就不過(guò)多介紹了。
Jstat
jstat命令主要是用來(lái)監(jiān)控虛擬機(jī)的狀態(tài)的,可以查看虛擬機(jī) GC 的情況,如下命令jstat -gcutil 2528 1000 10表示每 1000 毫秒輸出一次進(jìn)程 2528 的 GC 情況,并且總共輸出 10 次。
jstat 的手冊(cè)比較長(zhǎng),大家感興趣可以自行去查看下,這里只貼上面一部分給大家看下。
上面執(zhí)行的jstat -gcutil 2528 1000 10 如果修改成這個(gè)jstat -gcutil -h3 2528 1000 10,最后的效果會(huì)是下圖,我們可以看到每三行就增加了一個(gè)表頭,更多命令大家可以自己試試。
Jmap
jmap 命令用于生成dump 文件,jmap -dump:live,format=b,file=dump.bin 2528創(chuàng)建 dump 文件如下。
通過(guò)jmap 命令我們可以生成內(nèi)存快照文件,用于分析程序異常時(shí)的內(nèi)存信息,并且配合 jhat命令可以更好的使用。
Jhat
上面提到我們?cè)谑褂?jmap 的時(shí)候生成了一個(gè)內(nèi)存快照文件,那我們?nèi)绾尾榭催@個(gè)內(nèi)存文件呢?這里就需要結(jié)合jhat命令了。我們使用jhat dump.bin 就可以啟動(dòng)一個(gè)服務(wù),然后通過(guò)瀏覽器打開默認(rèn)的 7000 端口來(lái)查看信息。
訪問(wèn) 7000 端口如下:
Jstack
jstack用于生成java虛擬機(jī)當(dāng)前時(shí)刻的線程快照,線程快照是當(dāng)前 java 虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程間死鎖、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等。線程出現(xiàn)停頓的時(shí)候通過(guò) jstack來(lái)查看各個(gè)線程的調(diào)用堆棧,就可以知道沒(méi)有響應(yīng)的線程到底在后臺(tái)做什么事情,或者等待什么資源。
使用命令jstack 2528 查看線程堆棧情況如下:
通過(guò)這個(gè)命令我們可以看到進(jìn)程對(duì)應(yīng)的線程執(zhí)行情況,可以分析哪些線程在允許,哪些線程在等待。
總結(jié)
JDK 常見的命令阿粉就給大家介紹到這里,在平時(shí)的工作和學(xué)習(xí)中大家可以嘗試去使用一下,感受一下,這樣就算是在面試的時(shí)候或者實(shí)際要用的時(shí)候就能做的得心應(yīng)手。