Posted on 2009-11-30 23:13
Gavin.lee 閱讀(588)
評論(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()
返回表示該堆棧跟蹤元素的字符串。