Java Thread Dump – 系統卡死、CPU 100%等問題的診斷工具

什么是Thread Dump? 
 Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力。虽然各个 Java虚拟机thread dump打印输出格式上略微有一些不同,但是Thread dumps出来的信息包含线程;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。

Thread Dump特点 

 1. 能在各种操作系统下使用
 2. 能在各种Java应用服务器下使用   
  3. 可以在生产环境下使用而不影响系统的性能  
 4. 可以将问题直接定位到应用程序的代码行上

编辑本段Thread Dump能诊断的问题 
 1. 查找内存泄露,常见的是程序里load大量的数据到缓存   2. 发现死锁线程


SUN JVM 产生ThreadDump

1. Solaris OS
  <ctrl>-’\’ (Control-Backslash)   kill -QUIT <PID>

2. HP-UX/UNIX/Linux

 
1. ps -aef|grep java  //找到你要的线程id 
2.Kill -3 <PID>   //线程id这里就可以用了
3.more /$tomcat/ catalina.out

Full thread dump Java HotSpot(TM) Server VM (1.5.0_05-b05 mixed mode):

"TP-Monitor" daemon prio=1 tid=0x6ce4f808 nid=0x183f in Object.wait() [0x69af6000..0x69af70b0]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x70823250> (a org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable)
        at org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable.run(ThreadPool.java:559)
        - locked <0x70823250> (a org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable)
        at java.lang.Thread.run(Thread.java:595)

。。。。。。

4.ps -efHl | grep 'java' **. **


3.Window
  直接对MSDOS窗口的程序按Ctrl-break   有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在weblogic启动的时候,会将其标准输出重定向到一个文件,用"nohup ./startWebLogic .sh > log.out &"命令,执行"kill -3 <pid>",Thread dump就会输出到log.out里。Tomcat的Thread Dump会输出到命令行控制台或者logs的catalina.out文件里。为了反映线程状态的动态变化,需要接连做三次以上thread dump,每次间隔10-20s。

常见线程状态

   Sun JVM的常见线程状态

  对于thread dump信息,主要关注的是线程的状态和其执行堆栈  
 线程的状态一般为三类  
 Runnable(R):当前可以运行的线程  
 Waiting on monitor(CW):线程主动wait  
 Waiting for monitor entry(MW):线程等锁  
 一般关注的都是第一和第三种状态的线程  
 Cpu很忙则关注runnable的线程   
  Cpu闲则关注waiting for monitor entry的线程
 
 一种典型的死锁是由于在server端应用(比如servlet)中请求由同一weblogic实例server的资源,解决办法就是将该servlet放到另外的执行队列里去执行 。

猜你喜欢

转载自liliugen.iteye.com/blog/1156812
今日推荐