導航:首頁 > 編程語言 > jstack分析什麼

jstack分析什麼

發布時間:2023-03-13 10:50:09

⑴ 如何分析jvm mp 內存日誌

當伺服器掛起,崩潰或者性能底下時,就需要抓取伺服器的線程堆棧(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

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

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

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

1. jps

2. jstack

使用JVisualVM:

Threads 標簽頁àThreadDump按鈕.

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

1. webLogic.Admin 工具

a. 打開命令提示符, 通過運行/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 llegalArgumentException: Port out of range

:-1

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

at java.net.DatagramPacket.(Unknown Source)

at java.net.DatagramPacket.(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

⑵ 在新建虛擬機時出現問題

JConsole

JConsole 圖形用戶界面是一種符合 Java 管理擴展(JMX)規范的監視工具。JConsole 使用 Java 虛擬機 (Java VM) 的廣泛檢測來提供有關在 Java 平台上運行的應用程序的性能和資源消耗的信息。

使用方法 本地

⑶ 如何使用jstack分析線程狀態

jstack 線程狀態

jstack 線程里,值得關注的線程狀態有:

死鎖,Deadlock(重點關注)
執行中,Runnable

等待資源,Waiting
on condition(重點關注)
等待獲取監視器,Waiting
on monitor entry(重點關注)
暫停,Suspended
對象等待中,Object.wait()
或 TIMED_WAITING
阻塞,Blocked(重點關注)
停止,Parked

下面我們先從第一個例子開始分析,然後再列出不同線程狀態的含義以及注意事項,最後再補充兩個實例。

綜合示範一:Waiting
to lock 和 Blocked

實例如下:

"RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting
for monitor entry [0x00007fd4f8684000]

java.lang.Thread.State: BLOCKED
(on object monitor)

at org.apache.log4j.Category.callAppenders(Category.java:201)

- waiting
to lock <0x00000000acf4d0c0> (a org.apache.log4j.Logger)

at org.apache.log4j.Category.forcedLog(Category.java:388)

at org.apache.log4j.Category.log(Category.java:853)

at org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:234)

at com.tuan.core.common.lang.cache.remote.SpyMemcachedClient.get(SpyMemcachedClient.java:110)

……

1)線程狀態是 Blocked,阻塞狀態。說明線程等待資源超時!

2)「 waiting to lock <0x00000000acf4d0c0>」指,線程在等待給這個 0x00000000acf4d0c0 地址上鎖(英文可描述為:trying
to obtain 0x00000000acf4d0c0 lock)。

3)在 mp 日誌里查找字元串 0x00000000acf4d0c0,發現有大量線程都在等待給這個地址上鎖。如果能在日誌里找到誰獲得了這個鎖(如locked < 0x00000000acf4d0c0 >),就可以順藤摸瓜了。

4)「waiting for monitor entry」說明此線程通過 synchronized(obj) {……} 申請進入了臨界區,從而進入了下圖1中的「Entry
Set」隊列,但該 obj 對應的 monitor 被其他線程擁有,所以本線程在 Entry Set 隊列中等待。

5)第一行里,"RMI TCP Connection(267865)-172.16.5.25"是 Thread Name 。tid指Java Thread id。nid指native線程的id。prio是線程優先順序。[0x00007fd4f8684000]是線程棧起始地址。

Dump文件中的線程狀態含義及注意事項

含義如下所示:

Deadlock:死鎖線程,一般指多個線程調用間,進入相互資源佔用,導致一直等待無法釋放的情況。
Runnable:一般指該線程正在執行狀態中,該線程佔用了資源,正在處理某個請求,有可能正在傳遞SQL到資料庫執行,有可能在對某個文件操作,有可能進行數據類型等轉換。
Waiting on condition:等待資源,或等待某個條件的發生。具體原因需結合
stacktrace來分析。
一種情況是網路非常忙,幾乎消耗了所有的帶寬,仍然有大量數據等待網路讀寫;
另一種情況也可能是網路空閑,但由於路由等問題,導致包無法正常的到達。
如果堆棧信息明確是應用代碼,則證明該線程正在等待資源。一般是大量讀取某資源,且該資源採用了資源鎖的情況下,線程進入等待狀態,等待資源的讀取。
又或者,正在等待其他線程的執行等。
如果發現有大量的線程都在處在 Wait on condition,從線程 stack看,正等待網路讀寫,這可能是一個網路瓶頸的徵兆。因為網路阻塞導致線程無法執行。
另外一種出現 Wait on condition的常見情況是該線程在 sleep,等待 sleep的時間到了時候,將被喚醒。
Blocked:線程阻塞,是指當前線程執行過程中,所需要的資源長時間等待卻一直未能獲取到,被容器的線程管理器標識為阻塞狀態,可以理解為等待資源超時的線程。
Waiting for monitor entry 和 in Object.wait():Monitor是
Java中用以實現線程之間的互斥與協作的主要手段,它可以看成是對象或者 Class的鎖。每一個對象都有,也僅有一個
monitor。從下圖1中可以看出,每個 Monitor在某個時刻,只能被一個線程擁有,該線程就是 「Active
Thread」,而其它線程都是 「Waiting Thread」,分別在兩個隊列 「 Entry Set」和 「Wait Set」裡面等候。在
「Entry Set」中等待的線程狀態是 「Waiting for monitor entry」,而在 「Wait Set」中等待的線程狀態是
「in Object.wait()」。

圖1 A Java Monitor

綜合示範二:Waiting
on condition 和 TIMED_WAITING

實例如下:

"RMI TCP Connection(idle)" daemon prio=10 tid=0x00007fd50834e800 nid=0x56b2 waiting
on condition [0x00007fd4f1a59000]

java.lang.Thread.State: TIMED_WAITING (parking)

at sun.misc.Unsafe.park(Native Method)

- parking to wait for <0x00000000acd84de8> (a
java.util.concurrent.SynchronousQueue$TransferStack)

at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)

at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:424)

at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323)

at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:874)

at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)

at java.lang.Thread.run(Thread.java:662)

1)「TIMED_WAITING (parking)」中的 timed_waiting 指等待狀態,但這里指定了時間,到達指定的時間後自動退出等待狀態;parking指線程處於掛起中。

2)「waiting on condition」需要與堆棧中的「parking to wait for <0x00000000acd84de8> (a
java.util.concurrent.SynchronousQueue$TransferStack)」結合來看。首先,本線程肯定是在等待某個條件的發生,來把自己喚醒。其次,SynchronousQueue
並不是一個隊列,只是線程之間移交信息的機制,當我們把一個元素放入到 SynchronousQueue
中時必須有另一個線程正在等待接受移交的任務,因此這就是本線程在等待的條件。

3)別的就看不出來了。

綜合示範三:in
Obejct.wait() 和 TIMED_WAITING

實例如下:

"RMI RenewClean-[172.16.5.19:28475]"
daemon prio=10 tid=0x0000000041428800 nid=0xb09 in Object.wait() [0x00007f34f4bd0000]

java.lang.Thread.State: TIMED_WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on <0x00000000aa672478> (a java.lang.ref.ReferenceQueue$Lock)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)

- locked <0x00000000aa672478> (a java.lang.ref.ReferenceQueue$Lock)

at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(DGCClient.java:516)

at java.lang.Thread.run(Thread.java:662)

1)「TIMED_WAITING (on object monitor)」,對於本例而言,是因為本線程調用了 java.lang.Object.wait(long timeout) 而進入等待狀態。

2)「Wait Set」中等待的線程狀態就是「 in Object.wait() 」。當線程獲得了
Monitor,進入了臨界區之後,如果發現線程繼續運行的條件沒有滿足,它則調用對象(一般就是被 synchronized 的對象)的
wait() 方法,放棄了 Monitor,進入 「Wait Set」隊列。只有當別的線程在該對象上調用了
notify() 或者 notifyAll() ,「 Wait Set」隊列中線程才得到機會去競爭,但是只有一個線程獲得對象的
Monitor,恢復到運行態。

3)RMI RenewClean 是 DGCClient 的一部分。DGC 指的是 Distributed GC,即分布式垃圾回收。

4)請注意,是先 locked <0x00000000aa672478>,後 waiting on <0x00000000aa672478>,之所以先鎖再等同一個對象,請看下面它的代碼實現:

static private class Lock { };

private Lock lock = new Lock();

public Reference<? extends T> remove(long
timeout)

{

synchronized (lock) {

Reference<? extends T> r = reallyPoll();

if (r != null) return r;

for (;;) {

lock.wait(timeout);

r = reallyPoll();

……

}

}

即,線程的執行中,先用 synchronized 獲得了這個對象的 Monitor(對應於 locked <0x00000000aa672478> );當執行到 lock.wait(timeout);,線程就放棄了 Monitor 的所有權,進入「Wait Set」隊列(對應於 waiting
on <0x00000000aa672478> )。

5)從堆棧信息看,是正在清理 remote references to remote objects ,引用的租約到了,分布式垃圾回收在逐一清理呢。

⑷ jstack 分析出線程id 如何找到進程嗎

jstack 分析出線程id 如何找到進程
jstack用於列印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息。
如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式:jstack [-l] pid
如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。
另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。
需要注意的問題:
l 不同的 JAVA虛機的線程 DUMP的創建方法和文件格式是不一樣的,不同的 JVM版本, mp信息也有差別。
l 在實際運行中,往往一次 mp的信息,還不足以確認問題。建議產生三次 mp信息,如果每次 mp都指向同一個問題,我們才確定問題的典型性。
2、命令格式
$jstack [ option ] pid
$jstack [ option ] executable core
$jstack [ option ] [server-id@]remote-hostname-or-IP
參數說明:
pid: java應用程序的進程號,一般可以通過jps來獲得;
executable:產生core mp的java可執行程序;
core:列印出的core文件;
remote-hostname-or-ip:遠程debug伺服器的名稱或IP;
server-id: 唯一id,假如一台主機上多個遠程debug服務;

示例:
$jstack –l 23561

線程分析:
一般情況下,通過jstack輸出的線程信息主要包括:jvm自身線程、用戶線程等。其中jvm線程會在jvm啟動時就會存在。對於用戶線程則是在用戶訪問時才會生成。

閱讀全文

與jstack分析什麼相關的資料

熱點內容
如何修改蘋果電腦用戶名和密碼 瀏覽:164
win7電腦右下角的網路連接圖標不見 瀏覽:735
怎麼把ps文件變成源文件 瀏覽:807
如何把圖片放進這個文件夾 瀏覽:530
誰有qq認證圖標復制 瀏覽:881
2014年web伺服器測試工具 瀏覽:192
win7鏡像文件怎麼用 瀏覽:983
多數據can怎麼發送 瀏覽:997
什麼是夏威夷果種植技術app 瀏覽:160
上海學習編程哪個地方好 瀏覽:958
股票軟體與交易編程軟體哪個好 瀏覽:216
linux如何查看一個文件的位置 瀏覽:911
c頭文件無法打開源文件stdafx 瀏覽:750
蘋果x的桌面上可以建文件夾 瀏覽:368
ug8532位破解版安裝教程 瀏覽:490
電腦網路如何重新驅動 瀏覽:125
win10連接伺服器命令 瀏覽:228
盧克raid活動20升級卷 瀏覽:969
機票預訂什麼網站好 瀏覽:690
讀寫xml配置文件 瀏覽:153

友情鏈接