Java命令:jstack — 獲取線程dump信息

目錄

  • 一、命令介紹
  • 二、使用實例
    • 實例一:jstack查看輸出
    • 實例二:jstack統計線程數
    • 實例三:jstack檢測死鎖
    • 實例四:jstack檢測CPU高

一、命令介紹

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命令,首先我們要先找到要查看的進程ID,命令如下:

$ ps -ef | grep --color "com.javaagent.Main"

結果如下:
在這里插入圖片描述
紅框中即為進程ID。

實例一:jstack查看輸出

命令如下:

$ jstack -l 69239

輸出結果:

$ jstack -l 692392020-03-03 15:16:07
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.121-b13 mixed mode):"Attach Listener" #13 daemon prio=9 os_prio=31 tid=0x00007f9242141000 nid=0x5707 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"ThreadTest" #11 prio=5 os_prio=31 tid=0x00007f9242140800 nid=0x5503 waiting on condition [0x00007000013d2000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at com.javaagent.Main$2.run(Main.java:64)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- None..."ThreadTest_2" #10 prio=5 os_prio=31 tid=0x00007f9242100000 nid=0x5303 in Object.wait() [0x00007000012cf000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x0000000795856e18> (a java.lang.Object)at java.lang.Object.wait(Object.java:502)at com.javaagent.Main$1.run(Main.java:41)- locked <0x0000000795856e18> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- None"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007f9242004000 nid=0x3003 in Object.wait() [0x000070000092e000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x0000000795588ec8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)- locked <0x0000000795588ec8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)Locked ownable synchronizers:- None"VM Thread" os_prio=31 tid=0x00007f9243841800 nid=0x2c03 runnable "GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007f9243810800 nid=0x2403 runnable "GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007f9243811000 nid=0x2603 runnable "GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007f9243811800 nid=0x2803 runnable "GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007f9243812800 nid=0x2a03 runnable "VM Periodic Task Thread" os_prio=31 tid=0x00007f9243805000 nid=0x4d03 waiting on condition JNI global references: 25

實例二:jstack統計線程數

命令如下:

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

輸出結果:

12

實例三:jstack檢測死鎖

死鎖代碼:

package com.javaagent.thread;public class DieThread implements Runnable {public static Object obj1=new Object();public static Object obj2=new Object();private boolean flag;public DieThread(boolean bl){flag = bl;}@Overridepublic void run() {if(flag) {while(true) {synchronized(obj1) {System.out.println(Thread.currentThread().getName()+"....if...obj1...");synchronized(obj2) {System.out.println(Thread.currentThread().getName()+".....if.....obj2.....");}}}}else {while(true){synchronized(obj2) {System.out.println(Thread.currentThread().getName()+"....else...obj2...");synchronized(obj1) {System.out.println(Thread.currentThread().getName()+".....else.....obj1.....");}}}}}
}public class Main {public static void main(String[] args){DieThread d1=new DieThread(true);DieThread d2=new DieThread(false);final Thread t1 = new Thread(d1);final Thread t2 = new Thread(d2);t1.setName("DieThread_1");t2.setName("DieThread_2");t1.start();t2.start();}
}

命令如下:

$ jstack -l 69239

死鎖日志:

"DieThread_2" #11 prio=5 os_prio=31 tid=0x00007fc761896000 nid=0x5503 waiting for monitor entry [0x000070000134f000]java.lang.Thread.State: BLOCKED (on object monitor)at com.javaagent.thread.DieThread.run(DieThread.java:32)- waiting to lock <0x000000079586a768> (a java.lang.Object)- locked <0x000000079586a778> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- None"DieThread_1" #10 prio=5 os_prio=31 tid=0x00007fc7610dd800 nid=0x5307 waiting for monitor entry [0x000070000124c000]java.lang.Thread.State: BLOCKED (on object monitor)at com.javaagent.thread.DieThread.run(DieThread.java:21)- waiting to lock <0x000000079586a778> (a java.lang.Object)- locked <0x000000079586a768> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- NoneFound one Java-level deadlock:
=============================
"DieThread_2":waiting to lock monitor 0x00007fc7620421f8 (object 0x000000079586a768, a java.lang.Object),which is held by "DieThread_1"
"DieThread_1":waiting to lock monitor 0x00007fc762042358 (object 0x000000079586a778, a java.lang.Object),which is held by "DieThread_2"Java stack information for the threads listed above:
===================================================
"DieThread_2":at com.javaagent.thread.DieThread.run(DieThread.java:32)- waiting to lock <0x000000079586a768> (a java.lang.Object)- locked <0x000000079586a778> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)
"DieThread_1":at com.javaagent.thread.DieThread.run(DieThread.java:21)- waiting to lock <0x000000079586a778> (a java.lang.Object)- locked <0x000000079586a768> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Found 1 deadlock.

實例四:jstack檢測CPU高

步驟一:查看cpu占用高進程

輸入命令:

$ top

輸出結果:

top - 07:50:58 up 53 days, 23:38,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 113 total,   1 running, 112 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   7771904k total,  1770024k used,  6001880k free,   160496k buffers
Swap:  1048572k total,        0k used,  1048572k free,   844572k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    9075 root      20   0 19468 1540 1116 R  0.7  0.0   0:00.02 top                                                         1177 root      20   0  240m 4252 1688 S  0.3  0.1 176:47.24 oneagentwatchdo                                             1546 zabbix    20   0 81212 1616  728 S  0.3  0.0  28:12.55 zabbix_agentd                                               4433 root      20   0 4495m 566m  14m S  0.3  7.5  61:48.80 java                                                        1 root      20   0 23804 1772 1364 S  0.0  0.0   0:00.82 init                                                        2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                    3 root      RT   0     0    0    0 S  0.0  0.0   0:03.89 migration/0                                                 4 root      20   0     0    0    0 S  0.0  0.0   0:16.97 ksoftirqd/0

步驟二:查看cpu占用高線程

輸入命令:

$ top -H -p 4433

輸出結果:

top - 07:52:22 up 53 days, 23:40,  2 users,  load average: 0.08, 0.02, 0.01
Tasks:  62 total,   0 running,  62 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.1%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   7771904k total,  1770296k used,  6001608k free,   160496k buffers
Swap:  1048572k total,        0k used,  1048572k free,   844576k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    4433 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.00 java                                                        4434 root      20   0 4495m 566m  14m S  0.0  7.5   0:09.75 java                                                        4435 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.99 java                                                        4436 root      20   0 4495m 566m  14m S  0.0  7.5   0:01.00 java                                                        4437 root      20   0 4495m 566m  14m S  0.0  7.5   2:10.19 java                                                        4438 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.08 java                                                        4439 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.07 java                                                        4440 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.00 java                                                        4441 root      20   0 4495m 566m  14m S  0.0  7.5   0:06.90 java                                                        4446 root      20   0 4495m 566m  14m S  0.0  7.5   1:10.37 java                                                        4447 root      20   0 4495m 566m  14m S  0.0  7.5   0:04.77 java                                                        4448 root      20   0 4495m 566m  14m S  0.0  7.5   0:56.77 java

步驟三:轉換線程ID

printf "%x\n" 4434  //轉換成16進制

輸出結果:

1152   //16進制

步驟四:定位cpu占用線程

輸入命令:

$ jstack 4433 | grep 1152 -A 30

說明:

  • 4433:進程ID;
  • 1152:線程16進制ID;

輸出結果:

"main" #1 prio=5 os_prio=0 tid=0x00007f3b5c00b800 nid=0x1152 runnable [0x00007f3b61c8d000]java.lang.Thread.State: RUNNABLEat java.net.PlainSocketImpl.socketAccept(Native Method)at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)at java.net.ServerSocket.implAccept(ServerSocket.java:545)at java.net.ServerSocket.accept(ServerSocket.java:513)at org.apache.catalina.core.StandardServer.await(StandardServer.java:470)at org.apache.catalina.startup.Catalina.await(Catalina.java:793)at org.apache.catalina.startup.Catalina.start(Catalina.java:739)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)"VM Thread" os_prio=0 tid=0x00007f3b5c0fc000 nid=0x1155 runnable "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f3b5c020800 nid=0x1153 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f3b5c022800 nid=0x1154 runnable "VM Periodic Task Thread" os_prio=0 tid=0x00007f3b5cad6000 nid=0x117d waiting on condition JNI global references: 262

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446865.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java多線程死鎖例子

目錄一、產生死鎖的原因二、如何避免死鎖一、產生死鎖的原因 發生死鎖的情況&#xff1a; 多個線程需要同時占用多個共享資源而發生需要互相死循環等待的情況&#xff0c;就是&#xff0c;兩個線程互相等待著對象釋放鎖&#xff0c;一直這樣僵持下去&#xff0c;所以導致了死鎖…

C++中lock_guard的學習

lock_guard 鎖守衛是一個管理mutex對象的對象&#xff0c;使其始終處于鎖定狀態。在構造時&#xff0c;mutex對象被調用線程鎖定&#xff0c;在銷毀時&#xff0c;mutex被解鎖。這是最簡單的鎖&#xff0c;作為一個自動持續時間的對象&#xff0c;它的作用特別大&#xff0c;可…

安卓四大組件簡介

安卓四大組件 Activity活動&#xff0c;Service服務&#xff0c;BroadcastRecevicer廣播接受器&#xff0c;Content Provider內容提供者 Activity活動 所有程序的流程都運行在activity中 Service服務 只能后臺運行&#xff0c;沒有界面的長生命周期的代碼 BroadcastRece…

WebLogic域的創建與發布

目錄一、前言二、準備三、創建域步驟第一步&#xff1a;直接【回車】第二步&#xff1a;直接【回車】第三步&#xff1a;直接【回車】第四步&#xff1a;輸入域名稱后【回車】第五步&#xff1a;直接【回車】第六步&#xff1a;直接【回車】&#xff08;此步驟是提示域的存放目…

安卓安卓移動操作系統優缺點

安卓移動操作系統優缺點 開發性 豐富的硬件 方便開發 gogle應用 安卓模擬器 手機,手表,電視,車載,安卓cel LogCat的使用–5級(日志) Log.v()–verbose全部信息,黑色 Log.d()–debug調試信息,藍色 Log.i()–info一般信息,綠色 Log.w()–warning警告信息,橙色 Log.e()–erro…

WebLogic啟動失敗:java.lang.AssertionError: Could not obtain the localhost address.

目錄一、錯誤信息二、解決方案第一步&#xff1a;查看本機計算機名稱第二步&#xff1a;編輯hosts文件一、錯誤信息 linux下啟動WebLogic報如下錯誤&#xff1a; 二、解決方案 此錯誤多半是hosts文件不對導致的。 解決步驟如下&#xff1a; 第一步&#xff1a;查看本機計…

sqlite_orm sync_schema源碼即翻譯

源碼 /*** This is a cute function used to replace migration up/down functionality.* It performs check storage schema with actual db schema and:* * if there are excess tables exist in db they are ignored (not dropped)* * every table from storage is comp…

安卓布局UI簡介

安卓UI 用戶界面UI&#xff08;使用者界面&#xff09; ——系統和用戶之間進行交互和信息交換的媒體 由布局和組件組成 軟件設計&#xff1a;編碼設計和UI設計 布局 ——可定義應用中的界面結構 所有元素都使用View和Viewgroup對象的層次結構進行構建 view微件——構建用戶…

Windows查找JDK的路徑

第一步&#xff1a;確定是否安裝JDK 在控制臺輸入&#xff1a; java -version輸出結果&#xff1a; 此時說明你電腦安裝了JDK。 第二步&#xff1a;查找路徑 然后在控制臺輸入&#xff1a; java -verbose輸出結果&#xff1a; 從最后的jre目錄可以找到相應的jdk目錄。 …

boost官方文檔同步機制Synchronization mechanisms overview

參考鏈接 官方文檔 Synchronization mechanisms overview Named And Anonymous Synchronization MechanismsTypes Of Synchronization Mechanisms如前所述&#xff0c;如果不能有效地同步對內存的訪問&#xff0c;那么通過內存映射文件或共享內存對象在進程之間共享內存的能力…

安卓布局中xml文件屬性和ID簡介

編寫xml屬性 加載xml資源 當編譯應用時&#xff0c;系統會將每個xml文件編譯為view資源 屬性 xml屬性&#xff1a;特有屬性&#xff0c;共有屬性&#xff0c;其他屬性&#xff08;布局參數&#xff09; ID ——在結構樹中對view對象唯一標識 編譯應用后&#xff0c;系統以…

Java監控工具VisualVM

目錄一、簡介二、內存分析1、Heap堆三、CPU分析四、線程分析一、簡介 VisualVM 是一款免費的&#xff0c;集成了多個JDK命令行工具的可視化工具&#xff0c;它能為您提供強大的分析能力&#xff0c;對Java應用程序做 性能分析和調優 。這些功能包括 生成和分析海量數據、跟蹤內…

對官方Mutexes的翻譯

參考鏈接 參考鏈接 Mutexes Whats A Mutex?Mutex OperationsBoost.Interprocess Mutex Types And HeadersScoped lockAnonymous mutex exampleNamed mutex example Whats A Mutex? 互斥是相互排斥的意思&#xff0c;它是進程之間最基本的同步形式。互斥保證只有一個線程可…

計算機應用基礎

計算概論知識點 1.計算機之父&#xff1a;馮.諾伊曼 計算機基本組成&#xff1a;運算器&#xff0c;控制器&#xff0c;存儲器&#xff0c;輸入設備&#xff0c;輸出設備 2.幾種計算機&#xff1a;臺式計算機,筆記本式計算機,PC服務器,平板式計算機… 3.電腦的硬件&#xff1a;…

Android最全UI庫合集

目錄抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新ViewPager圖表(Chart)菜單(Menu)浮動菜單對話框空白頁滑動刪除手勢操作RecyclerViewCardColorDrawableSpinner布局模糊效果TabBarAppBar選擇器(Picker)跑馬燈日歷時間主題樣式ImageView通知聊天…

對于boost鎖機制結論性的介紹

Conditions Whats A Condition Variable?Boost.Interprocess Condition Types And HeadersAnonymous condition example Whats A Condition Variable? 在前面的例子中&#xff0c;一個mutex被用來鎖定&#xff0c;但我們不能用它來有效地等待&#xff0c;直到滿足繼續的條件…

C++數據類型

C 數據類型 |–基本數據類型: 整型 short短整型 2 int基本整型4 long長整型 8 浮點型 float單精度型 4 double雙精度型 8 long double長雙精度型 16 字符型 char 1 邏輯型 bool 1 空類型 void |–構造類型 數組類型 構造體類型 struct 共用體類型 union 枚舉類型 enum 類類型…

Android Gradle 多渠道打包、動態配置AppName

目錄一、簡介二、Gradle多渠道打包1、普通做法2、Gradle多渠道打包一、簡介 因為國內Android應用分發市場的現狀&#xff0c;我們在發布APP時&#xff0c;一般需要生成多個渠道包&#xff0c;上傳到不同的應用市場。這些渠道包需要包含不同的渠道信息&#xff0c;在APP和后臺交…

boost鎖機制中Semaphores的介紹

結構 Whats A Semaphore?Boost.Interprocess Semaphore Types And HeadersAnonymous semaphore example Whats A Semaphore? 旗語是一種基于內部計數的進程間同步機制&#xff0c;它提供了兩種基本操作。等待&#xff1a;測試旗語數的值&#xff0c;如果小于或等于0&#x…

Android Gradle 批量修改生成的apk文件名

目錄一、簡介二、代碼實現1、 Gradle 3.0以下版本2、Gradle 3.0以上版本一、簡介 平時開發都知道&#xff0c;我們要上線的時候需要在Android studio打包apk文件&#xff0c;可是默認的打包名是app-release.apk或者app-debug.apk這樣的名字&#xff0c;太沒有辨識度了。 下面…