[b]什么是Thread Dump?[/b]
Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力。虽然各个 Java虚拟机thread dump打印输出格式上略微有一些不同,但是Thread dumps出来的信息包含线程;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。
[b]Thread Dump特点[/b]
1. 能在各种操作系统下使用
2. 能在各种Java应用服务器下使用
3. 可以在生产环境下使用而不影响系统的性能
4. 可以将问题直接定位到应用程序的代码行上
[b]编辑本段Thread Dump能诊断的问题[/b]
1. 查找内存泄露,常见的是程序里load大量的数据到缓存 2. 发现死锁线程
[b]SUN JVM 产生ThreadDump[/b]
1. Solaris OS
<ctrl>-’\’ (Control-Backslash) kill -QUIT <PID>
2. HP-UX/UNIX/Linux
[color=red]
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' **. **
[/color]
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。
[b]常见线程状态[/b]
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放到另外的执行队列里去执行 。
Thread Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的thread-dump的能力。虽然各个 Java虚拟机thread dump打印输出格式上略微有一些不同,但是Thread dumps出来的信息包含线程;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。
[b]Thread Dump特点[/b]
1. 能在各种操作系统下使用
2. 能在各种Java应用服务器下使用
3. 可以在生产环境下使用而不影响系统的性能
4. 可以将问题直接定位到应用程序的代码行上
[b]编辑本段Thread Dump能诊断的问题[/b]
1. 查找内存泄露,常见的是程序里load大量的数据到缓存 2. 发现死锁线程
[b]SUN JVM 产生ThreadDump[/b]
1. Solaris OS
<ctrl>-’\’ (Control-Backslash) kill -QUIT <PID>
2. HP-UX/UNIX/Linux
[color=red]
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' **. **
[/color]
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。
[b]常见线程状态[/b]
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放到另外的执行队列里去执行 。