本文档介绍如何使用Java jstack命令获取Java堆栈转储。此过程在Windows、Linux和UNIX以及使用Oracle Sun Java 1.6+版的任何Tidal系统上均有效。
思科建议您了解Java并了解运行Java的操作系统。此外,系统上还需要安装Java JDK(Java开发工具包)1.6+版。
Sun Java JRE 1.6+
Sun Java JDK 1.6+
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
有时,支持人员需要捕获主日志中未包含的低级线程数据。
要使用Oracle Sun提供的jstack工具捕获Java堆栈转储,请完成以下步骤。
注意:要运行jstack命令,Java进程必须运行Sun Java 1.6+,并且必须在系统上安装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]