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

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

Java代码触发生成ThreadDump

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

只有注册用户登录后才能发表评论。


网站导航: