導航:首頁 > 編程大全 > 開源threaddump分析工具tda

開源threaddump分析工具tda

發布時間:2022-05-23 09:53:42

1. 如何抓取Thread Dump

當伺服器掛起,崩潰或者性能底下時,就需要抓取伺服器的線程堆棧(Thread Dump)用於後續的分析.

Thread mp提供了當前活動的線程的快照. 它提供了JVM中所有java線程的棧跟蹤信息

有很多方式可用於獲取Thread Dump, 一些是操作系統特定的命令.

操作系統命令獲取ThreadDump:

Windows:

1. 轉向伺服器的標准輸出窗口並按下Control + Break組合鍵, 之後需要將線程堆棧復制到文件

UNIX/ Linux

首先查找到伺服器的進程號(process id), 然後獲取堆棧.

1. ps –ef | grep java

2. kill -3 <pid>

注意一定要謹慎, 一步不慎就可能讓伺服器進程被殺死!

JVM 自帶的工具獲取線程堆棧:

JDK自帶命令行工具獲取PID並做ThreadDump:

1. jps

2. jstack <pid>

使用JVisualVM:

Threads 標簽頁àThreadDump按鈕.

WebLogic 自帶的獲取 thread mp的工具:

1. webLogic.Admin 工具

a. 打開命令提示符, 通過運行<DOMAIN_HOME>/bin/setDomain.env設置相關類路徑

b. 執行下面的命令

java weblogic.Admin -url t3://localhost:7001 -username weblogic -password weblogic1 THREAD_DUMP

注意: Thread Dump 會列印到標准輸出, 如nohup日誌或者進程窗口.

2. 使用 Admin Console

a. 登錄 Admin Console , 點擊對應的伺服器

b. 點擊Server à Monitoring àThreads

c. 點擊: Dump Thread Stack 按鈕

3. 使用WLST (WebLogic Scripting Tool)

connect(『weblogic』,'weblogic1』,』t3://localhost:7001』)

cd(『Servers』)

cd(『AdminServer』)

threadDump()

disconnect()

exit()

注意: 線程堆棧將會保存在運行wlst的當前目錄下.

4. 使用utils.ThreadDumper

用法:

C:\bea\wlserver_10.3\server\lib>java -cp weblogic.jar utils.ThreadDumper

Broadcast Thread mps disabled: must specify weblogic.debug.mpThreadAddr and

weblogic.debug.mpThreadPort

Exception in thread "main" java.lang.I www.hbbz08.com llegalArgumentException: Port out of range

:-1

at java.net.DatagramPacket.setPort(Unknown Source)

at java.net.DatagramPacket.<init>(Unknown Source)

at java.net.DatagramPacket.<init>(Unknown Source)

at utils.ThreadDumper.sendDumpMsg(ThreadDumper.java:124)

at utils.ThreadDumper.main(ThreadDumper.java:145)

5. 如果伺服器是作為Windows服務的方式運行, 請運行下列命令:

WL_HOME\bin\beasvc -mp -svcname:service-name

2. Java 中怎麼獲取一份線程 mp 文件

當伺服器掛起,崩潰或者性能底下時,就需要抓取伺服器的線程堆棧(Thread Dump)用於後續的分析.

Thread mp提供了當前活動的線程的快照.它提供了JVM中所有Java線程的棧跟蹤信息

有很多方式可用於獲取Thread Dump,一些是操作系統特定的命令.


Windows:

1. 轉向伺服器的標准輸出窗口並按下Control + Break組合鍵,之後需要將線程堆棧復制到文件中

UNIX/ Linux

首先查找到伺服器的進程號(process id),然後獲取堆棧.

1. ps –ef| grep java

2. kill -3 <pid>

注意一定要謹慎,一步不慎就可能讓伺服器進程被殺死!


JDK自帶命令行工具獲取PID並做ThreadDump:

1. jps

2.jstack <pid>

使用JVisualVM:

Threads標簽頁 →ThreadDump按鈕


1. webLogic.Admin工具

a.打開命令提示符,通過運行<DOMAIN_HOME>/bin/setDomain.env設置相關類路徑

b.執行下面的命令

java weblogic.Admin -url t3://localhost:7001 -username weblogic -password weblogic1 THREAD_DUMP

注意: Thread Dump會列印到標准輸出,如nohup日誌或者進程窗口.

2.使用 Admin Console

a.登錄Admin Console ,點擊對應的伺服器

b.點擊ServeràMonitoringàThreads

c.點擊: Dump Thread Stack按鈕

3.使用WLST (WebLogic Scripting Tool)

connect(『weblogic』,'weblogic1』,』t3://localhost:7001』)

cd(『Servers』)

cd(『AdminServer』)

threadDump()

disconnect()

exit()

注意:線程堆棧將會保存在運行wlst的當前目錄下.

4.使用utils.ThreadDumper

用法:

C:eawlserver_10.3serverlib>java -cp weblogic.jar utils.ThreadDumper

Broadcast Thread mps disabled: must specify weblogic.debug.mpThreadAddr and

weblogic.debug.mpThreadPort

Exception in thread "main" java.lang.IllegalArgumentException: Port out of range

:-1

at java.net.DatagramPacket.setPort(Unknown Source)

at java.net.DatagramPacket.<init>(Unknown Source)

at java.net.DatagramPacket.<init>(Unknown Source)

at utils.ThreadDumper.sendDumpMsg(ThreadDumper.java:124)

at utils.ThreadDumper.main(ThreadDumper.java:145)

5.如果伺服器是作為Windows服務的方式運行,請運行下列命令:

WL_HOMEineasvc -mp -svcname:service-name


$JAVA_

3. 如何分析java thread mp

thread mp解析
頭部信息
時間,jvm信息

{code}
2011-11-02 19:05:06
Full thread mp Java HotSpot(TM) Server VM (16.3-b01 mixed mode):
{code}
線程info信息塊
{code}
"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x740ad988> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
- locked <0x740ad988> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
{code}

"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]

* 線程名稱:Checkpointer
* 線程類型:daemon
* 優先順序:10,默認是5
* jvm線程id:jvm內部線程的唯一標識,0x68ce1c00
* 對應系統線程id:和top命令查看的pid對應,不過一個是10進制,一個是16進制。0x7c11
* 線程狀態:Object.wait().
* 起始棧地址
線程狀態詳解
Runnable
_The thread is either running or ready to run when it gets its CPU turn._
不解釋。

Wait on condition
_The thread is either sleeping or waiting to be notified by another thread._
該狀態出現在線程等待某個條件的發生或者sleep。
_最常見的情況是線程在等待網路的讀寫,比如當網路數據沒有準備好讀時,線程處於這種等待狀態,而一旦有數據准備好讀之後,線程會重新激活,讀取並處理數據。_

Waiting for Monitor Entry and in Object.wait()
_The thread is waiting to get the lock for an object (some other thread may be holding the lock). This happens if two or more threads try to execute synchronized code. Note that the lock is always for an object and not for indivial methods._
當一個線程申請進入臨界區時,獲取到monitor,線程將處於 「Runnable」的狀態,否則,線程 DUMP會顯示處於 「waiting for monitor entry」。
當線程獲得了 Monitor,進入了臨界區之後,如果發現線程繼續運行的條件沒有滿足,它則調用對象(一般就是被 synchronized 的對象)的 wait() 方法,放棄了 Monitor,進入 「Wait Set」隊列。只有當別的線程在該對象上調用了 notify() 或者 notifyAll() , 「 Wait Set」隊列中線程才得到機會去競爭,但是只有一個線程獲得對象的 Monitor,恢復到運行態。在 「Wait Set」中的線程, DUMP中表現為: in Object.wait()。
例:

<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff6666;">{code}
"Timer-0" daemon prio=10 tid=0x695c3000 nid=0x7c00 in Object.wait() [0x69468000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x744f2850> (a java.util.TaskQueue) ###繼續wait
at java.util.TimerThread.mainLoop(Timer.java:509)
- locked <0x744f2850> (a java.util.TaskQueue) ###已經lock到0x744f2850
at java.util.TimerThread.run(Timer.java:462)
{code}</span></span>
參見:http://jameswxx.iteye.com/blog/1041173

{code}
java.lang.Thread.State: WAITING (on object monitor)
<p style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; ">{code}</p>
線程狀態運行:
WAITING||State || Description||
|blocked|This thread tried to enter a synchronized block, but the lock was taken by another thread. This thread is blocked until the lock gets released.|
|blocked (on thin lock)|This is the same state as blocked, but the lock in question is a thin lock.||waiting|This thread called Object.wait() on an object. The thread will remain there until some other thread sends a notification to that object.|
|sleeping|This thread called java.lang.Thread.sleep().||parked|This thread called java.util.concurrent.locks.LockSupport.park().||suspended|The thread's execution was suspended by java.lang.Thread.suspend() or a JVMTI agent call.|
{code}
at java.lang.Object.wait(Native Method)
- waiting on <0x740ad988> (a java.lang.Object) ###等待堆地址為0x740ad988的java.lang.Object對象的鎖
at java.lang.Object.wait(Object.java:485)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
- locked <0x740ad988> (a java.lang.Object) ###hold住堆地址為0x740ad988的java.lang.Object對象的鎖
at java.lang.Thread.run(Thread.java:619)
{code}

4. 怎樣分析 JAVA 的 Thread Dumps

當有障礙,或者是一個基於 JAVA 的 WEB 應用運行的比預期慢的時候,我們需要使用 thread mps。如果對於你來說,thread mps 是非常復雜的,這篇文章或許能對你有所幫助。在這里我將解釋在 JAVA 中什麼是 threads,他們的類型,怎麼被創建的,怎樣管理它們,你怎樣從正在運行的應用中 mp threads,最後你可以怎樣分析它以及確定瓶頸或者是阻塞線程。本文來自於 JAVA 應用程序長期調試經驗的結果。


Java and Thread

一個 web 伺服器使用幾十到幾百個線程來處理大量並發用戶,如果一個或多個線程使用相同的資源,線程之間的競爭就不可避免了,並且有時候可能會發生死鎖。


Thread contention 是一個線程等待鎖的一個狀態,這個鎖被另外一個線程持有,等待被釋放,不同的線程頻繁訪問 WEB 應用的共享資源。例如,記錄一條日誌,線程嘗試記錄日誌之前必須先獲取鎖來訪問共享資源。


死鎖是線程競爭的一個特殊狀態,一個或是多個線程在等待其他線程完成它們的任務為了完成它們自己的任務。


線程競爭會引起各種不同的問題,為了分析這些這些問題,你需要使用 mp threads,mp threads 能給你提供每個線程的精確狀態信息。


JAVA 線程的背景資料

線程同步

一個線程可以與其他線程在同一時間內被處理。為了確保一致性,當多個線程試圖使用共享資源的時候,通過使用 hread synchronization 在同一時間內,應該只有一個線程能訪問共享資源


JAVA 中的線程同步可以使用監視器,每個 JAVA 對象都有一個單獨的監視器,這個監視器僅僅只能被一個線程擁有,對於擁有一個由不同的線程所擁有的監視器的線程,確實需要在隊列中等待,以便其他線程釋放它的監視器。


線程狀態

為了分析一個 thread mp 文件,你需要知道線程狀態。線程情況在 java.lang.Thread.State 中闡明了。

當使用 java.lang.Thread 對象創建線程的時候,線程被命名為 Thread-(Number) 。當使用 java.util.concurrent.DefaultThreadFactory 對象創建線程的時候,線程被命名為 named pool-(Number)-thread-(Number)。當為應用程序分析成百上千的線程的時候,如果線程依然用它們默認的名字,分析它們將變得非常困難,因為這是非常難以辨別這些線程來分析的。


因此,你被建議開發一個命名線程的規則當一個新線程被創建的時候。


當你使用 java.lang.Thread 創建線程,你可以通過創建參數給該線程定義個約定俗成的名字。


public Thread(Runnable target, String name);

public Thread(ThreadGroup group, String name);

public Thread(ThreadGroup group, Runnable target, String name);

public Thread(ThreadGroup group, Runnable target, String name, long stackSize);

當你使用 java.util.concurrent.ThreadFactory 創建線程的時候,你可以通過生成你自己的線程工廠來命名它,如果你不需要特別的功能性,你可以使用 MyThreadFactory 作為以下描述:


import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.ThreadFactory;

import java.util.concurrent.atomic.AtomicInteger;


public class MyThreadFactory implements ThreadFactory {

private static final ConcurrentHashMap<String, AtomicInteger> POOL_NUMBER =

new ConcurrentHashMap<String, AtomicInteger>();

private final ThreadGroup group;

private final AtomicInteger threadNumber = new AtomicInteger(1);

private final String namePrefix;


public MyThreadFactory(String threadPoolName) {


if (threadPoolName == null) {

throw new NullPointerException("threadPoolName");

}

POOL_NUMBER.putIfAbsent(threadPoolName, new AtomicInteger());


SecurityManager securityManager = System.getSecurityManager();

group = (securityManager != null) ? securityManager.getThreadGroup() :

Thread.currentThread().getThreadGroup();


AtomicInteger poolCount = POOL_NUMBER.get(threadPoolName);


if (poolCount == null) {

namePrefix = threadPoolName + " pool-00-thread-";

} else {

namePrefix = threadPoolName + " pool-" + poolCount.getAndIncrement() + "-thread-";

}

}


public Thread newThread(Runnable runnable) {

Thread thread = new Thread(group, runnable, namePrefix + threadNumber.getAndIncrement(), 0);


if (thread.isDaemon()) {

thread.setDaemon(false);

}


if (thread.getPriority() != Thread.NORM_PRIORITY) {

thread.setPriority(Thread.NORM_PRIORITY);

}


return thread;

}

}

使用 MBean 獲取更多的細節信息

你可以使用 MBean 來獲取 ThreadInfo 對象。你也可以獲取更加多通過 thread mps 不能獲取的信息。通過使用 ThreadInfo。


ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();

long[] threadIds = mxBean.getAllThreadIds();

ThreadInfo[] threadInfos =

mxBean.getThreadInfo(threadIds);


for (ThreadInfo threadInfo : threadInfos) {

System.out.println(

threadInfo.getThreadName());

System.out.println(

threadInfo.getBlockedCount());

System.out.println(

threadInfo.getBlockedTime());

System.out.println(

threadInfo.getWaitedCount());

System.out.println(

threadInfo.getWaitedTime());

}

你可以使用方法 ThreadInfo 來提取阻塞線程或者是等待線程花費的時間。並利用這一點,你也可以得到那些處於非活動狀態的時間異常長的線程列表。

5. 如何分析kill -3 thread mp

NEW: 線程被創建但是還沒有被執行
RUNNABLE: 線程正在佔用cpu並且在執行任務
BLOCKED: 線程為了獲得監視器需要等待其他線程釋放鎖
WAITING: 調用了wait,join,park方法使線程等待-無限期等待
TIMED_WAITING: 調用了sleep,wait,join,park方法使線程等待--有限期等待
線程類型
java中線程可以分為兩種:
1. 後台線程

2. 非後台線程

當沒有其他的非後台線程運行時後台線程將會終止。即使你不創建線程,java應用默認也會創建很多線程。這些大多數都是後台線程,主要為了執行gc或者jmx等類型的任務
從 'static void main(String[] args)』方法中開啟的線程叫做非後台線程,當這些線程停止時,其他的所有後台線程也會停止()
獲得一個Thread Dump

6. 如何使用ibm thread and monitor mp analyzer for java工具

一個詳細的 GC 數據可視化器,用於分析並繪制所有 IBM 詳細 GC 日誌——Xtgc 輸出(並且可擴展到分析和繪制其他形式的輸入)。它提供了廣泛的詳細 GC 數據值的圖形顯示,並處理 optthruput、optavgpause 和 gencon GC 模式。它具有原始日誌、表格式數據和圖表視圖,並且可以將數據保存到 jpeg 或 .csv 文件(用於導出到電子表格)。

7. 如何分析Thread Dump

如何分析Thread Dump
thread mp解析
頭部信息
時間,jvm信息

{code}
2011-11-02 19:05:06
Full thread mp Java HotSpot(TM) Server VM (16.3-b01 mixed mode):
{code}
線程info信息塊
{code}
"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x740ad988> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
- locked <0x740ad988> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
{code}

"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]

* 線程名稱:Checkpointer
* 線程類型:daemon
* 優先順序:10,默認是5
* jvm線程id:jvm內部線程的唯一標識,0x68ce1c00
* 對應系統線程id:和top命令查看的pid對應,不過一個是10進制,一個是16進制。0x7c11
* 線程狀態:Object.wait().
* 起始棧地址
線程狀態詳解
Runnable
_The thread is either running or ready to run when it gets its CPU turn._
不解釋。

8. 如何分析java Thread DUMP

一、Thread Dump介紹
1.1什麼是Thread Dump?
Thread Dump是非常有用的診斷Java應用問題的工具。每一個Java虛擬機都有及時生成所有線程在某一點狀態的thread-mp的能力,雖然各個 Java虛擬機列印的thread mp略有不同,但是大多都提供了當前活動線程的快照,及JVM中所有Java線程的堆棧跟蹤信息,堆棧信息一般包含完整的類名及所執行的方法,如果可能的話還有源代碼的行數。

1.2 Thread Dump特點
1. 能在各種操作系統下使用
2. 能在各種Java應用伺服器下使用
3. 可以在生產環境下使用而不影響系統的性能
4. 可以將問題直接定位到應用程序的代碼行上

1.3 Thread Dump 能診斷的問題
1. 查找內存泄露,常見的是程序里load大量的數據到緩存;
2. 發現死鎖線程;

1.4如何抓取Thread Dump
一般當伺服器掛起,崩潰或者性能底下時,就需要抓取伺服器的線程堆棧(Thread Dump)用於後續的分析. 在實際運行中,往往一次 mp的信息,還不足以確認問題。為了反映線程狀態的動態變化,需要接連多次做threadmp,每次間隔10-20s,建議至少產生三次 mp信息,如果每次 mp都指向同一個問題,我們才確定問題的典型性。

有很多方式可用於獲取ThreadDump, 下面列出一部分獲取方式:
操作系統命令獲取ThreadDump:
Windows:
1.轉向伺服器的標准輸出窗口並按下Control + Break組合鍵, 之後需要將線程堆棧復制到文件中;
UNIX/ Linux:
首先查找到伺服器的進程號(process id), 然後獲取線程堆棧.
1. ps –ef | grep java
2. kill -3 <pid>
注意:一定要謹慎, 一步不慎就可能讓伺服器進程被殺死。kill -9 命令會殺死進程。

JVM 自帶的工具獲取線程堆棧:
JDK自帶命令行工具獲取PID,再獲取ThreadDump:
1. jps 或 ps –ef|grepjava (獲取PID)
2. jstack [-l ]<pid> | tee -a jstack.log (獲取ThreadDump)

二、java線程的狀態轉換介紹(為後續分析做准備)

2.1 新建狀態(New)
用new語句創建的線程處於新建狀態,此時它和其他Java對象一樣,僅僅在堆區中被分配了內存。
2.2 就緒狀態(Runnable)
當一個線程對象創建後,其他線程調用它的start()方法,該線程就進入就緒狀態,Java虛擬機會為它創建方法調用棧和程序計數器。處於這個狀態的線程位於可運行池中,等待獲得CPU的使用權。
2.3 運行狀態(Running)
處於這個狀態的線程佔用CPU,執行程序代碼。只有處於就緒狀態的線程才有機會轉到運行狀態。
2.4 阻塞狀態(Blocked)
阻塞狀態是指線程因為某些原因放棄CPU,暫時停止運行。當線程處於阻塞狀態時,Java虛擬機不會給線程分配CPU。直到線程重新進入就緒狀態,它才有機會轉到運行狀態。
阻塞狀態可分為以下3種:
1)位於對象等待池中的阻塞狀態(Blocked in object』s wait pool):當線程處於運行狀態時,如果執行了某個對象的wait()方法,Java虛擬機就會把線程放到這個對象的等待池中,這涉及到「線程通信」的內容。
2)位於對象鎖池中的阻塞狀態(Blocked in object』s lock pool):當線程處於運行狀態時,試圖獲得某個對象的同步鎖時,如果該對象的同步鎖已經被其他線程佔用,Java虛擬機就會把這個線程放到這個對象的鎖池中,這涉及到「線程同步」的內容。

9. 請問Tomcat里的Thread Dump是干什麼用的

Thread Dump是非常有用的診斷Java應用問題的工具,每一個Java虛擬機都有及時生成顯示所有線程在某一點狀態的thread-mp的能力。雖然各個 Java虛擬機thread mp列印輸出格式上略微有一些不同,但是Thread mps出來的信息包含線程;線程的運行狀態、標識和調用的堆棧;調用的堆棧包含完整的類名,所執行的方法,如果可能的話還有源代碼的行數

10. flink wed UI Thread Dump的報錯

Flink使用Web UI可以方便本地調試,基本使用如下:
pom添加
代碼中使用創建
Flink在進行集合的迭代轉換時可以是循環或是迭代計算處理。flink的流式處理的是真正的流處理。流式數據一但進入就實時進行處理,這就允許流數據靈活地在操作窗口。

閱讀全文

與開源threaddump分析工具tda相關的資料

熱點內容
excel文件查看器 瀏覽:718
電影理發師殺死女友 瀏覽:419
word2003剪貼板 瀏覽:208
手機微信文件已過期或已被清理怎麼辦 瀏覽:997
免費看會員電影網站 瀏覽:639
女生去找在北京送快遞的男朋友的電影 瀏覽:67
子非魚網路技術有限公司 瀏覽:119
適合二人看的愛情片怦然心動 瀏覽:830
Linux安裝軟體還是文件啊 瀏覽:322
如何在線找網路主播 瀏覽:493
趣味編程如何下載 瀏覽:26
測繪大數據處理 瀏覽:739
appstore禁用銀行卡 瀏覽:369
ios支持文件夾導入的看書軟體 瀏覽:657
微信轉賬5000元圖片 瀏覽:703
桂林萬象城電影院今日影訊 瀏覽:58
note4文件管理移植 瀏覽:682
那種在線觀看網址鏈 瀏覽:321
資料庫中性別用什麼字元 瀏覽:672
易捷文件加密軟體注冊碼 瀏覽:312

友情鏈接