Posted on 2009-11-30 23:13
Gavin.lee 阅读(581)
评论(0) 编辑 收藏 所属分类:
java SE & EE
ThreadDump对于JVM诊断和调优是个好东西. 以前, 我们生成ThreadDump, 一般都需要另外连到服务器上的进程管理器才行, 不管是Ctrl+Break还是kill –3, 比较不方便. 有时候, 也许想远程直接生成并检查一下服务器的ThreadDump, 这个怎么办呢? 幸好我们有以下代码可以做到:
package yixun.wap.tools;
import java.util.Map;
/** *//**
* 使用 Java 远程代码生成 ThreadDump. 适用于 JDK 1.5+.
* 参考: {@link ThreadgetStackTrace()}
* {@link ThrowablegetStackTrace()}
* @see StackTraceElement
*/
public class ThreadDumpBuilder {
/** *//**
* 生成并返回 Thread Dump.
* @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("<br/>");
for (StackTraceElement element : stack) {
output.append("\t").append(element).append("\n<br/>");
}
}
}
然后在一个JSP里或者Servlet中任意调用即可:
<%=new ThreadDumpBuilder().build() %>
===== END OF THREAD DUMP ===============
参考资料:
1. Atlassian Confluence 3.0 管理控制台
2. JDK的DEMO
jdk1.5.0\demo\management\FullThreadDump
原文:http://ajava.org/course/java/13843.html
java.lang
类 StackTraceElement 方法:
boolean equals(Object obj)
如果指定的对象是另一个 StackTraceElement 实例,并且该对象表示的执行点与该实例的相同,则返回 ture。
String getClassName()
返回类的完全限定名,该类包含由该堆栈跟踪元素所表示的执行点。
String getFileName()
返回源文件名,该文件包含由该堆栈跟踪元素所表示的执行点。
int getLineNumber()
返回源行的行号,该行包含由该堆栈该跟踪元素所表示的执行点。
String getMethodName()
返回方法名,此方法包含由该堆栈跟踪元素所表示的执行点。
int hashCode()
返回此堆栈跟踪元素的哈希码值。
boolean isNativeMethod()
如果包含由该堆栈跟踪元素所表示的执行点的方法是一个本机方法,则返回 true。
String toString()
返回表示该堆栈跟踪元素的字符串。