設計模式的目的 編寫軟體過程中,程式員面臨著來自 耦合性,內聚性以及可維護性,可擴展性,重用性,靈活性 等多方面的 挑戰,設計模式是為了讓程式(軟體),具有更好 代碼重用性 (即:相同功能的代碼,不用多次編寫) 可讀性 (即:編程規範性, 便於其他程式員的閱讀和理解) 可擴展性 (即:當需要增加新的 ...
Jstack排查線上CPU100%
介紹
jstack是JVM自帶的Java堆棧跟蹤工具,用於生成java虛擬機當前時刻的線程快照,來幫助定位線程出現長時間停頓的原因,例如死鎖、死迴圈等。
語法
jstack [options] pid
options:
- -F:to force a thread dump. Use when jstack
does not respond (process is hung),當一個進程掛起時,jstack 命令沒有響應時,強制輸出這個線程轉儲信息。 - -m:to print both java and native frames (mixed mode),列印JAVA和包含本地方法的C/C++的堆棧信息。
- -l:long listing. Prints additional information about locks,列印堆棧信息,包含鎖的其他信息,例如死鎖等。
實操
-
找出cpu使用率最高的進程
top -c
-
找出CPU使用率最高的進程,查詢該pid進程下的線程使用情況
ps -mp 進程id -o THREAD,tid,time
-
將線程id轉換成16進位
printf "%x\n" tid
-
jstack查看相應線程的堆棧
jstack 進程id | grep 16進位線程id -A 30 # 或者列印到文件 jstack pid | grep tid >> jstack.txt
擴展
JVM線程的幾種狀態
New
新建的線程,線程還沒啟動。
Runnable
線程正在運行或者等待操作系統中的其他資源,例如線程運行過程中,系統分配資源給其他操作,此時這個線程還是Runnable狀態,可以理解為可運行的線程。
Blocked
阻塞狀態,阻塞狀態的線程正在等待監視器鎖,在Dump日誌中一般顯示為java.lang.Thread.State: BLOCKED
Waiting
等待線程,線程正在無限期的等待另一個線程執行某些特別操作。一般線程由於調用一下方法會處於等待狀態。
Object.wait // 不帶超時
Thread.join // 不帶超時
LockSupport.park
Time_Waiting
和Waiting類似,但是線程等待有時間限制,設定了指定等待時間。一般線程由於調用一下方法會處於超時等待狀態。
Thread.sleep
Object.wait // 指定超時時間
Thread.join // 指定超時時間
LockSupport.parkNanos
LockSupport.parkUntil
Terminated
終止狀態。
原文鏈接:https://monkey.blog.xpyvip.top/archives/jstack-pai-cha-xian-shang-cpu