无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java代码触发生成ThreadDump

Posted on 2009-11-30 23:13 Gavin.lee 阅读(584) 评论(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()
          返回表示该堆栈跟踪元素的字符串。