1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Java“魔法”-jstack命令解析

        共 4650字,需瀏覽 10分鐘

         ·

        2021-05-24 21:39


        怕什么真理無窮

        進(jìn)一步有近一步的歡喜



        前情預(yù)告

        在介紹jstack之前,先簡單介紹一下jps。因?yàn)閖ps使用相對簡單,各位看官看一下便知。

        jps的作用是顯示當(dāng)前系統(tǒng)的java進(jìn)程情況,及其id號。jps是【進(jìn)程查詢】魔法。

        Java進(jìn)程Id的查詢也可以使用如:

        ps -ef | grep java

        需說明一下:jps僅查找當(dāng)前用戶的Java進(jìn)程,而不是當(dāng)前系統(tǒng)中的所有進(jìn)程。

        常用命令:

        # 查看 java 進(jìn)程,顯示 pid,完整包名以及 main 函數(shù)參數(shù)
        jps -ml
        # 查看Java進(jìn)程對應(yīng)的給JVM的參數(shù)
        jps -v
        # 根據(jù) name 查找 java 進(jìn)程
        jps -mlvV | grep <name>
        # 根據(jù) name 查找 pid
        jps | grep <name>

        舉個示例:


        jps -lm

        jps -lv

        lv:要記住哈~ 到這里jps也就告一段落了,下面正式開始jstack的內(nèi)容。

        jstack介紹

        jstack用于生成java虛擬機(jī)當(dāng)前時刻的線程快照。線程快照是當(dāng)前java虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源導(dǎo)致的長時間等待等。線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調(diào)用堆棧,就可以知道沒有響應(yīng)的線程到底在后臺做什么事情,或者等待什么資源。


        jstack命令主要用來查看Java線程的調(diào)用堆棧的,可以用來分析線程問題(如死鎖)。

        命令說明

        官網(wǎng)文檔地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html


        Usage:
            jstack [-l] <pid>
                (to connect to running process) 連接活動線程
            jstack -F [-m] [-l] <pid>
                (to connect to a hung process) 連接阻塞線程
            jstack [-m] [-l] <executable> <core>
                (to connect to a core file) 連接dump的文件
            jstack [-m] [-l] [server_id@]<remote server IP or hostname>
                (to connect to a remote debug server) 連接遠(yuǎn)程服務(wù)器

        Options:
            -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
            -m  to print both java and native frames (mixed mode)
            -l  long listing. Prints additional information about locks
            -h or -help to print this help message

        在使用jstack之前需要先大概知道線程的狀態(tài)相關(guān)的知識,下面為你準(zhǔn)備好了。

        線程狀態(tài)

        線程在運(yùn)行的過程中,會在幾種狀態(tài)中進(jìn)行切換,我們可以用jstack命令查看線程堆棧信息時,可能會看到的線程的幾種狀態(tài),了解這些線程的狀態(tài),方便后續(xù)對于具體問題的排查和解決。

        • NEW :未啟動的。不會出現(xiàn)在Dump中
        • RUNNABLE :在虛擬機(jī)中準(zhǔn)備執(zhí)行的
        • BLOCKED :阻塞并等待監(jiān)視器鎖
        • WATING :無限期等待另一個線程執(zhí)行特定操作
        • TIMED_WATING :有時限的等待另一個線程的特定操作
        • TERMINATED :已退出的,線程終止

        jstack輸出日志

        知道要查詢應(yīng)用的PId,就可以使用jstack 輸出線程的信息。

        # 輸出結(jié)果  
        jstack -l pid    
        #輸出結(jié)果到日志中
        jstack -l pid > /tmp/jstack.log 

        大致信息如下:

        Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.151-b12 mixed mode):

        "Attach Listener" #50173 daemon prio=9 os_prio=0 tid=0x00007f4ba401a800 nid=0x69ab waiting on condition [0x0000000000000000]
           java.lang.Thread.State: RUNNABLE

           Locked ownable synchronizers:
                - None

        "Pinpoint-Grpc-ActiveThreadCountService-Timer" #12474 daemon prio=5 os_prio=0 tid=0x00007f4b54051000 nid=0x292b in Object.wait() [0x00007f4bd067f000]
           java.lang.Thread.State: WAITING (on object monitor)
                at java.lang.Object.wait(Native Method)
                at java.lang.Object.wait(Object.java:502)
                at java.util.TimerThread.mainLoop(Timer.java:526)
                - locked <0x00000000f065d3f0> (a java.util.TaskQueue)
                at java.util.TimerThread.run(Timer.java:505)

           Locked ownable synchronizers:
                - None

        使用的技巧

        jstack檢測死鎖

        Found one Java-level deadlock:
        .... 省略信息
        Found 1 deadlock

        jstack統(tǒng)計(jì)線程數(shù)

        jstack -l pid | grep 'java.lang.Thread.State' | wc -l

        jstack檢測cpu占用高

        1、查看cpu占用高進(jìn)程 2、查看cpu占用高線程 2、轉(zhuǎn)換線程ID 4、定位cpu占用線程 5、分析原因和解決

        具體的詳細(xì)步驟可以參考我之前寫的這篇文章:體驗(yàn)了一把線上CPU100%及應(yīng)用OOM的排查和解決過程


        推薦閱讀:
        體驗(yàn)了一把線上CPU100%及應(yīng)用OOM的排查和解決過程


        tips最近很多伙伴后臺留言說準(zhǔn)備換新地方體驗(yàn)【擰螺絲】的工作了,

        但是沒有好的【造火箭】的資,這不,特意整理了一份,內(nèi)容非常豐富,包括大廠Java面試資料和經(jīng)驗(yàn)總結(jié),截圖如下

        后臺回復(fù)【造火箭】獲取資料



        推薦閱讀:
        你管這破玩意兒叫 Token?
        一舉拿下高可用與分布式協(xié)調(diào)系統(tǒng)設(shè)計(jì)!

        一文讀懂微內(nèi)核架構(gòu)


        關(guān)互聯(lián)網(wǎng)全棧架構(gòu),。

        瀏覽 52
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            我操逼视频 | 操逼看看 | 97五月天婷婷 | 美女露出让男生揉的电影 | 亚洲国产成人无码影视 | 深爱激情网开心五月天 | 黄片草逼 | 精品国产999久久久免费 | 食物链大尺度床戏 | 美女扒开腿免费网站 |