本文檔介紹如何使用Java jstack命令獲取Java堆棧轉儲。此過程在Windows、Linux和UNIX以及使用Oracle Sun Java 1.6+的任何Tidal系統上均有效。
Cisco建議您瞭解Java知識以及運行Java的作業系統。此外,需要在系統上安裝Java JDK(Java Development Kit)版本1.6+。
Sun Java JRE 1.6+
Sun Java JDK 1.6+
如需文件慣例的詳細資訊,請參閱思科技術提示慣例。
有時,支援人員需要捕獲主日誌中沒有的低級執行緒資料。
要使用Oracle Sun提供的jstack工具捕獲Java堆疊轉儲,請完成以下步驟。
注意:Java進程必須運行Sun Java 1.6+才能運行jstack命令,並且必須在系統上安裝JDK。在此處下載Oracle Sun JDK 。
在運行Java進程的電腦上查詢進程標識號。
在Windows電腦上,您可以使用工作管理員查詢進程標識號。
具體來說,PID是進程標識號。如果您沒有看到此列,請選擇View > Columns > PID(進程識別符號)以便新增它。
在UNIX/Linux上,可以發出ps -ef | grep UnixMaster命令以獲取進程ID:
root@sunts06:/# ps -ef | grep UnixMaster root 5452 5423 0 14:43:21 pts/14 0:00 grep UnixMaster root 1868 1 0 Jun 09 ? 31:49 /usr/bin/java -DN=UnixMaster -DTI DAL_HOME=/opt/TIDAL/master/bin/.. -Xms256m -Xm root@sunts06:/#
獲得所需的進程標識號後,轉至安裝Sun JDK的BIN目錄,然後發出jstack {PID} 命令,其中{PID}是進程標識號。這會將Java堆疊資訊列印到螢幕。
C:\Program Files\Java\jdk1.6.0_25\bin>jstack 3724 2011-06-30 20:07:37 Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode): "Swing-Shell" daemon prio=6 tid=0x0000000006cce800 nid=0x1bd8 waiting on conditi on [0x000000000843f000] java.lang.Thread.State:WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000fb38ace8> (a java.util.concurrent.lock s.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject .await(Unknown Source) at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source) at java.util.concurrent.ThreadPoolExecuter.getTask(Unknown Source) at java.util.concurrent.ThreadPoolExecuter$Worker.run(Unknown Source) at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Unknown Source) at java.lang.Thread.run(Unknown Source) "Thread-2" prio=6 tid=0x0000000006cd0800 nid=0xe6c waiting on condition [0x00000 0000833f000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method)
若要將堆疊資訊重新導向至檔案,請使用將在Windows和Linux/UNIX中都能執行的檔案建立選項發出相同的命令:
jstack {PID} > [filename.out]