Java命令行監(jiān)控工具(jmap,jstack,jstat,jinfo,jps)

項(xiàng)目部署上線之后刹缝,線上項(xiàng)目是不能輕易修改的,定位問題的難度也會變大颈将。因此監(jiān)控是非常重要的一個(gè)環(huán)節(jié)梢夯,有了監(jiān)控,我們才能更好的定位系統(tǒng)中的問題晴圾,從而排查颂砸。監(jiān)控的工具有很多種, 但是java自帶的命令行監(jiān)控工具死姚,是必須要掌握的人乓。

jps

查看系統(tǒng)中jvm進(jìn)程, 其它的命令通常先使用jps查看進(jìn)程號,然后在根據(jù)線程號獲取jvm進(jìn)程信息


image.png

jps -m 查看jvm進(jìn)程并且?guī)в袇?shù)查看
jps -v 查看傳遞到j(luò)vm的參數(shù)

官方j(luò)ps解釋:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jps.html

jstat

顯示JVM的性能統(tǒng)計(jì)信息都毒,
常見用法:jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
例如:查看JIT編譯信息色罚,GC信息和JVM中的class信息。


image.png

解釋下-gc選項(xiàng)中列的含義:-gc查看垃圾收集器中的信息账劲, 主要包含jvm的運(yùn)行時(shí)數(shù)據(jù)區(qū)統(tǒng)計(jì)戳护。
后綴為C的代表當(dāng)前區(qū)的容量,后綴為U的代表已經(jīng)使用了多少容量瀑焦,后綴為T的代表耗時(shí)

S0C 存活區(qū)0的容量(KB)
S1C 存活區(qū)1的容量(KB)
S0U 存活區(qū)0使用的空間 (KB).
S1U 存活區(qū)1的利用空間 (KB).
EC Eden區(qū)的容量(KB).
EU Eden區(qū)利用的容量(KB).
OC 老年代容量(KB).
OU 老年代使用容量(KB).
PC 當(dāng)前永久帶的容量(KB).
PU 永久帶使用容量(KB).
YGC 發(fā)生了多少次Young GC
YGCT Young GC的時(shí)間
FGC Full GC的次數(shù)
FGCT Full GC的收集時(shí)間
GCT 總共的GC時(shí)間.

官方j(luò)stat解釋:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html

jstack

查看線程堆棧信息腌且,在發(fā)生死鎖的時(shí)候可以利用這個(gè)命令查找死鎖或者在發(fā)生死循環(huán)的時(shí)候利用此命令排查。

jstack vmpid 會打印線程的堆棧信息榛瓮。通過堆椘潭可以查看具體線程正在執(zhí)行那些代碼,廈門演示兩個(gè)使用jstack排查死鎖與死循環(huán)的命令禀晓。

死鎖代碼:

public class DeadLock {

    private static Object o1 = new Object();
    private static Object o2 = new Object();
    private static CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {
        new Thread(){
            @Override
            public void run() {
                synchronized (o1){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程1 獲得鎖1");
                    synchronized (o2){
                        System.out.println("線程1 獲得鎖2");
                        countDownLatch.countDown();
                    }
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                synchronized (o2){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程2 獲得鎖2");
                    synchronized (o1){
                        System.out.println("線程2 獲得鎖1");
                        countDownLatch.countDown();
                    }
                }
            }
        }.start();

        countDownLatch.await();
        System.out.println("執(zhí)行完畢");
        
    }

}

死鎖之后:
可以看到j(luò)stack已經(jīng)幫我們找到了死鎖柄粹。


image.png

image.png

死循環(huán)需要配合Top命令一起使用,死循環(huán)會導(dǎo)致CPU不斷的飆升匆绣,這時(shí)候使用top命令,查看cpu占用率較高的命令:

image.png

使用top -H -p 24278 查看進(jìn)程中具體是那一條線程的CPU利用率高


image.png

可以看到是24279的線程什黑,在top中使用的是10進(jìn)制崎淳,在jstack中打印的線程是16進(jìn)制,因此做一次轉(zhuǎn)換愕把。
24279 => 5ed7
然后查看線程:


image.png

然后我們可以知道具體那一行的指令在一直運(yùn)行拣凹。

jstack官方文檔解釋

jinfo查看JVM啟動時(shí)候設(shè)置的參數(shù)值

jinfo可以查看當(dāng)前JVM線程配置的系統(tǒng)屬性,以及運(yùn)行時(shí)設(shè)置的參數(shù)值恨豁。

直接使用jinfo

  1. 前半段是系統(tǒng)的屬性


    image.png
  1. 后半段是jvm的參數(shù)


    image.png

我們也可以直接使用jinfo查看具體的某個(gè)參數(shù)值:


image.png

jinfo官方解釋

jmap分析堆

在發(fā)生OME的時(shí)候嚣镜,會用jmap分析堆中具體是什么問題,才能更好的解決問題橘蜜。jmap一般和mat配合使用菊匿。

一般在java開發(fā)的項(xiàng)目啟動時(shí)候付呕,最好加上下面命令,在內(nèi)存溢出的時(shí)候可以通過日志查看信息跌捆。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/dump

當(dāng)然在項(xiàng)目運(yùn)行的時(shí)候也可以使用jmap -heap jvmpid查看對象內(nèi)存的映射徽职。

演示內(nèi)存溢出

堆內(nèi)存溢出代碼

public class DealCycle {
    public static LinkedList<Integer> linkedList = new LinkedList<>();
    public static void main(String[] args) {
        int i = 0;
        while (true){
            linkedList.add(i);
        }
    }
}

運(yùn)行:


image.png

大家可以去網(wǎng)站上下載java mat的二進(jìn)制壓縮包,學(xué)習(xí)一下

在線分析hprof文件:
http://heaphero.io/

image.png

image.png

如果每次都等到內(nèi)存溢出才導(dǎo)出文件時(shí)間就有些晚了佩厚,可以使用jmap直接導(dǎo)出

image.png

jmap官方解釋

最后

這篇文章主要介紹了java自帶的命令行工具姆钉,通過這些命令行工具,我們可以很好的得知當(dāng)前jvm的運(yùn)行狀態(tài)抄瓦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潮瓶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钙姊,更是在濱河造成了極大的恐慌毯辅,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摸恍,死亡現(xiàn)場離奇詭異悉罕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)立镶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門壁袄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人媚媒,你說我怎么就攤上這事嗜逻。” “怎么了缭召?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵栈顷,是天一觀的道長。 經(jīng)常有香客問我嵌巷,道長萄凤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任搪哪,我火速辦了婚禮靡努,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晓折。我一直安慰自己惑朦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布漓概。 她就那樣靜靜地躺著漾月,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胃珍。 梳的紋絲不亂的頭發(fā)上梁肿,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天蜓陌,我揣著相機(jī)與錄音,去河邊找鬼栈雳。 笑死护奈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哥纫。 我是一名探鬼主播霉旗,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛀骇!你這毒婦竟也來了厌秒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤擅憔,失蹤者是張志新(化名)和其女友劉穎鸵闪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑诸,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚌讼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了个榕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篡石。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖西采,靈堂內(nèi)的尸體忽然破棺而出凰萨,到底是詐尸還是另有隱情,我是刑警寧澤械馆,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布胖眷,位于F島的核電站,受9級特大地震影響霹崎,放射性物質(zhì)發(fā)生泄漏珊搀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一尾菇、第九天 我趴在偏房一處隱蔽的房頂上張望食棕。 院中可真熱鬧,春花似錦错沽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忆植,卻和暖如春放可,著一層夾襖步出監(jiān)牢的瞬間谒臼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工耀里, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜈缤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓冯挎,卻偏偏與公主長得像底哥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子房官,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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