<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java“魔法”-jstack命令解析

          共 4650字,需瀏覽 10分鐘

           ·

          2021-05-24 21:39


          怕什么真理無窮

          進一步有近一步的歡喜



          前情預告

          在介紹jstack之前,先簡單介紹一下jps。因為jps使用相對簡單,各位看官看一下便知。

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

          Java進程Id的查詢也可以使用如:

          ps -ef | grep java

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

          常用命令:

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

          舉個示例:


          jps -lm

          jps -lv

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

          jstack介紹

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


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

          命令說明

          官網(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) 連接遠程服務器

          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)相關的知識,下面為你準備好了。

          線程狀態(tài)

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

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

          jstack輸出日志

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

          # 輸出結果  
          jstack -l pid    
          #輸出結果到日志中
          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)計線程數(shù)

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

          jstack檢測cpu占用高

          1、查看cpu占用高進程 2、查看cpu占用高線程 2、轉換線程ID 4、定位cpu占用線程 5、分析原因和解決

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


          推薦閱讀:
          體驗了一把線上CPU100%及應用OOM的排查和解決過程


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

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

          后臺回復【造火箭】獲取資料



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

          一文讀懂微內核架構


          互聯(lián)網(wǎng)全棧架構

          瀏覽 52
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码日本精品XXXXXXXXX | 青青自拍视频 | 中文字幕在线不卡视频 | 九一福利在线观看 | 亚洲第一福利在线久 |