thread dump获取
1. 发送信号* In Unix, use "kill -3 <pid>" where pid is the Process ID of the JVM.(kill
信号列表)* In Windows, press CTRL+BREAK on the window where the JVM is running.
2. jstack -l pid.
(1). jstack入口
-
publicclassJStack{
-
publicstaticvoidmain(String[]args)throwsException{
-
...
-
Stringpid=args[optionCount];
-
Stringparams[];
-
if(locks){
-
params=newString[]{"-l"};
-
}else{
-
params=newString[0];
-
}
-
runThreadDump(pid,params);
-
...
-
}
-
-
privatestaticvoidrunThreadDump(Stringpid,Stringargs[])
-
throwsException{
-
VirtualMachinevm=null;
-
try{
-
vm=VirtualMachine.attach(pid);
-
}catch(Exceptionx){
-
...
-
}
-
-
-
InputStreamin=((HotSpotVirtualMachine)vm)
-
.remoteDataDump((Object[])args);
-
-
byteb[]=newbyte[256];
-
intn;
-
do{
-
n=in.read(b);
-
if(n>0){
-
Strings=newString(b,0,n,"UTF-8");
-
System.out.print(s);
-
}
-
}while(n>0);
-
in.close();
-
vm.detach();
-
}
(2).执行方式LinuxVirtualMachine.execute
-
-
-
-
@Override
-
InputStreamexecute(Stringcmd,Object...args)throwsAgentLoadException,IOException
-
{
-
...
-
ints=socket();
-
-
try{
-
connect(s,p);
-
}
-
catch(IOExceptionx){
-
close(s);
-
throwx;
-
}
-
IOExceptionioe=null;
-
-
-
try{
-
writeString(s,PROTOCOL_VERSION);
-
writeString(s,cmd);
-
for(inti=0;i<3;i++){
-
if(i<args.length&&args[i]!=null){
-
writeString(s,(String)args[i]);
-
}
-
else{
-
writeString(s,"");
-
}
-
}
-
}
-
catch(IOExceptionx){
-
ioe=x;
-
}
-
-
SocketInputStreamsis=newSocketInputStream(s);
-
....
-
-
returnsis;
-
}
3. jvisualvm中来thread dump.
thread dump解析
头部信息
时间,jvm信息
-
{code}
-
2011-11-0219:05:06
-
FullthreaddumpJavaHotSpot(TM)ServerVM(16.3-b01mixedmode):
-
{code}
线程info信息块
-
{code}
-
"Checkpointer"daemonprio=10tid=0x68ce1c00nid=0x7c11inObject.wait()[0x68b5c000]
-
java.lang.Thread.State:WAITING(onobjectmonitor)
-
atjava.lang.Object.wait(NativeMethod)
-
-waitingon<0x740ad988>(ajava.lang.Object)
-
atjava.lang.Object.wait(Object.java:485)
-
atcom.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
-
-locked<0x740ad988>(ajava.lang.Object)
-
atjava.lang.Thread.run(Thread.java:619)
-
{code}
-
"Checkpointer"daemonprio=10tid=0x68ce1c00nid=0x7c11inObject.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 individual
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()。
例:
-
<spanstyle="background-color:rgb(255,255,255);"><spanstyle="color:#ff6666;">{code}
-
"Timer-0"daemonprio=10tid=0x695c3000nid=0x7c00inObject.wait()[0x69468000]
-
java.lang.Thread.State:TIMED_WAITING(onobjectmonitor)
-
atjava.lang.Object.wait(NativeMethod)
-
-waitingon<0x744f2850>(ajava.util.TaskQueue)###继续wait
-
atjava.util.TimerThread.mainLoop(Timer.java:509)
-
-locked<0x744f2850>(ajava.util.TaskQueue)###已经lock到0x744f2850
-
atjava.util.TimerThread.run(Timer.java:462)
-
{code}</span></span>
参见:http://jameswxx.iteye.com/blog/1041173
-
{code}
-
java.lang.Thread.State:WAITING(onobjectmonitor)
-
<pstyle="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}
-
atjava.lang.Object.wait(NativeMethod)
-
-waitingon<0x740ad988>(ajava.lang.Object)###等待堆地址为0x740ad988的java.lang.Object对象的锁
-
atjava.lang.Object.wait(Object.java:485)
-
atcom.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
-
-locked<0x740ad988>(ajava.lang.Object)###hold住堆地址为0x740ad988的java.lang.Object对象的锁
-
atjava.lang.Thread.run(Thread.java:619)
-
{code}
thread dump使用
首先,thread dump是个瞬时数据,需要多个采样进行对比才能更好的发现问题
cpu飙高,load高,响应很慢
方案:* 一个请求过程中多次dump
* 对比多次dump文件的runnable线程,如果执行的方法有比较大变化,说明比较正常。如果在执行同一个方法,就有一些问题了。
cpu使用率不高但是响应很慢
方案:* 进行dump,查看是否有很多thread struck在了i/o、数据库等地方,定位瓶颈原因。
请求无法响应
方案:* 多次dump,对比是否所有的runnable线程都一直在执行相同的方法,如果是的,恭喜你,锁住了!
死锁例子:
-
publicclassDeadLock{
-
publicstaticvoidmain(String[]args){
-
finalObjectobj_1=newObject(),obj_2=newObject();
-
Threadt1=newThread("t1"){
-
@Override
-
publicvoidrun(){
-
synchronized(obj_1){
-
try{
-
Thread.sleep(3000);
-
}catch(InterruptedExceptione){}
-
synchronized(obj_2){
-
System.out.println("threadt1done.");
-
}
-
}
-
}
-
};
-
Threadt2=newThread("t2"){
-
@Override
-
publicvoidrun(){
-
synchronized(obj_2){
-
try{
-
Thread.sleep(3000);
-
}catch(InterruptedExceptione){}
-
synchronized(obj_1){
-
System.out.println("threadt2done.");
-
}
-
}
-
}
-
};
-
t1.start();
-
t2.start();
-
}
-
}
thread dump
-
"t2"prio=10tid=0x09d0d000nid=0x1f17waitingformonitorentry[0x71dad000]
-
java.lang.Thread.State:BLOCKED(onobjectmonitor)
-
atDeadLock$2.run(DeadLock.java:30)
-
-waitingtolock<0x9f4c29b0>(ajava.lang.Object)
-
-locked<0x9f4c29b8>(ajava.lang.Object)
-
Lockedownablesynchronizers:
-
-None
-
"t1"prio=10tid=0x09d22c00nid=0x1f16waitingformonitorentry[0x71dfe000]
-
java.lang.Thread.State:BLOCKED(onobjectmonitor)
-
atDeadLock$1.run(DeadLock.java:15)
-
-waitingtolock<0x9f4c29b8>(ajava.lang.Object)
-
-locked<0x9f4c29b0>(ajava.lang.Object)
-
Lockedownablesynchronizers:
-
-None
-
-
FoundoneJava-leveldeadlock:
-
=============================
-
"t2":
-
waitingtolockmonitor0x09c32f18(object0x9f4c29b0,ajava.lang.Object),
-
whichisheldby"t1"
-
"t1":
-
waitingtolockmonitor0x09c32360(object0x9f4c29b8,ajava.lang.Object),
-
whichisheldby"t2"
-
-
Javastackinformationforthethreadslistedabove:
-
===================================================
-
"t2":
-
atDeadLock$2.run(DeadLock.java:30)
-
-waitingtolock<0x9f4c29b0>(ajava.lang.Object)
-
-locked<0x9f4c29b8>(ajava.lang.Object)
-
"t1":
-
atDeadLock$1.run(DeadLock.java:15)
-
-waitingtolock<0x9f4c29b8>(ajava.lang.Object)
-
-locked<0x9f4c29b0>(ajava.lang.Object)
-
-
-
Found1deadlock.
查找占用cpu最多的线程信息
方案:# dump thread# 找到导致cpu高的线程:top -H -p pid,对应的线程id是十进制的。(top命令详解见:http://www.w3pop.com/learn/view/p/1/o/1/doc/linux_cmd_top/)# 十进制转十六进制# 从dump中找到对应的线程
转自
http://blog.csdn.net/wanyanxgf/article/details/6944987
分享到:
相关推荐
java thread dump 分析
thread and mointor dump analyzer,java线程文件分析工具
好用的线程dump分析工具
python 脚本从nohup.out ibm core 文件 ,或者从weblogic 的console 里面 thread dump 整理出来,统一格式便于查看,适合于性能分析
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
Thread Dump Analyzer用于分析线程dump文件,将dump文件导入到tda中。找到阻塞的线程。阻塞的线程是红色的。
java线程分析工具
包括 堆内存dump分析工具和thread dump(java core)的分析工具 还包括两篇关于dump分析的文档,分析java系统内存泄露死循环等非常需要啊有木有
IBM 线程堆栈分析工具,IBM Thread and Monitor Dump Analyzer for java
sun jvm格式threaddump 分析工具。
https://java.net/projects/tda/downloads/directory/visualvm 官方下载的,附带使用方法,Visualvm的TDA插件,能很好的分析线程Dump日志,吐血推荐!
IBM Thread and Monitor Dump Analyzer for Java(简称 jca)。它可以识别Java线程中的挂起,死锁,资源竞争,和瓶颈。 使用方法: java -Xmx1000m -jar jca456.jar
Thread Dump Analyzer - tda-bin-2.2.zip 用于分析查看java 的thread dump
java线上故障分析-线程dump,堆内存分析
用于分析查看java 的thread dump日志文件 Thread Dump Analyzer,tda-bin-2.3.3
java Thread Dump 其实就是stack trace。 我们平时经常会碰见java异常,并且得到异常的方法用e.printstacktrace 实际上程序正常运行时也是会有stack trace的,只不过平时不显示出来而已。如何能正常及时显示堆栈信息...
用于分析查看java 的thread dump日志文件 TDA - Thread Dump Analyzer
用Java thread dump 去分析程序的问题,英文版的word文档,对于分析定位程序问题。
分析线程情况 JavaCore 或 ThreadDump文件,即线程的映像,用来分析线程资源锁等情况
IBM最新java threaddump 分析工具 java -jar jca.jar -Xmx1024m jca.jar