用Java代码来触发生成ThreadDump
时间:2011-01-16 BlogJava BeanSoft
ThreadDump对于JVM诊断和调优是个好东西. 以前, 我们生成ThreadDump, 一般都需要另外连到服务器上的进程管理器才行, 不管是Ctrl+Break还是kill –3, 比较不方便. 有时候, 也许想远程直接生成并检查一下服务器的ThreadDump, 这个怎么办呢? 幸好我们有以下代码可以做到:
util.threaddump.ThreadDumpBuilder.java
package util.threaddump;
import java.util.Map;
/**
* 使用 Java 远程代码生成 ThreadDump. 适用于 JDK 1.5+.
* 参考: {@link Thread#getStackTrace()}
* {@link Throwable#getStackTrace()}
* @see StackTraceElement
* @author beansoft@126.com
* 转载请注明出处: beansoft.blogjava.net
*/
public class ThreadDumpBuilder {
/**
* 生成并返回 Thread Dump.
* 转载请注明出处: beansoft.blogjava.net
* @return
*/
public String build() {
StringBuilder output = new StringBuilder(1000);
for (Map.Entry stackTrace : Thread.getAllStackTraces().entrySet()) {
appendThreadStackTrace(output, (Thread) stackTrace.getKey(),
(StackTraceElement[]) stackTrace.getValue());
}
return output.toString();
}
/**
* 处理并输出堆栈信息.
* @param output
* 输出内容
* @param thread
* 线程
* @param stack
* 线程堆栈
*/
private void appendThreadStackTrace(StringBuilder output, Thread thread,
StackTraceElement[] stack) {
// 忽略当前线程的堆栈信息
if (thread.equals(Thread.currentThread())) {
return;
}
output.append(thread).append("\n");
for (StackTraceElement element : stack) {
output.append("\t").append(element).append("\n");
}
}
}
喘Java旗鷹栖乾窟伏撹ThreadDump(2)
扮寂:2011-01-16 BlogJava BeanSoft
隼朔壓匯倖JSP戦賜宀Servlet嶄販吭距喘軸辛:
<%=new ThreadDumpBuilder().build() %>
厘喘議 Oracle JRocket ReamTime 議JVM怒議腎議Tomcat, 補竃坪否泌和:
Thread[(GC Main Thread),5,system]
Thread[Main Thread,5,main]
java.net.PlainSocketImpl.socketAccept(Native Method)
java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
java.net.ServerSocket.implAccept(ServerSocket.java:453)
java.net.ServerSocket.accept(ServerSocket.java:421)
org.apache.catalina.core.StandardServer.await(StandardServer.java:389)
org.apache.catalina.startup.Catalina.await(Catalina.java:630)
org.apache.catalina.startup.Catalina.start(Catalina.java:590)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
|