Java代碼觸發(fā)生成ThreadDump
Posted on 2009-11-30 23:13 Gavin.lee 閱讀(589) 評論(0) 編輯 收藏 所屬分類: java SE & EEThreadDump對于JVM診斷和調(diào)優(yōu)是個好東西. 以前, 我們生成ThreadDump, 一般都需要另外連到服務(wù)器上的進程管理器才行, 不管是Ctrl+Break還是kill –3, 比較不方便. 有時候, 也許想遠(yuǎn)程直接生成并檢查一下服務(wù)器的ThreadDump, 這個怎么辦呢? 幸好我們有以下代碼可以做到:
package yixun.wap.tools;

import java.util.Map;

/**
* 使用 Java 遠(yuǎn)程代碼生成 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
* 輸出內(nèi)容
* @param thread
* 線程
* @param stack
* 線程堆棧
*/
private void appendThreadStackTrace(StringBuilder output, Thread thread,
StackTraceElement[] stack) {
// 忽略當(dāng)前線程的堆棧信息
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中任意調(diào)用即可:
<%=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 實例,并且該對象表示的執(zhí)行點與該實例的相同,則返回 ture。
String getClassName()
返回類的完全限定名,該類包含由該堆棧跟蹤元素所表示的執(zhí)行點。
String getFileName()
返回源文件名,該文件包含由該堆棧跟蹤元素所表示的執(zhí)行點。
int getLineNumber()
返回源行的行號,該行包含由該堆棧該跟蹤元素所表示的執(zhí)行點。
String getMethodName()
返回方法名,此方法包含由該堆棧跟蹤元素所表示的執(zhí)行點。
int hashCode()
返回此堆棧跟蹤元素的哈希碼值。
boolean isNativeMethod()
如果包含由該堆棧跟蹤元素所表示的執(zhí)行點的方法是一個本機方法,則返回 true。
String toString()
返回表示該堆棧跟蹤元素的字符串。