用Java代码来触发生成ThreadDump
2009-09-23 00:00:00 来源:WEB开发网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");
}
}
}
更多精彩
赞助商链接