posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Java代碼觸發(fā)生成ThreadDump

          Posted on 2009-11-30 23:13 Gavin.lee 閱讀(589) 評論(0)  編輯  收藏 所屬分類: java SE & EE
          ThreadDump對于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()
                    返回表示該堆棧跟蹤元素的字符串。
           
          主站蜘蛛池模板: 平顺县| 河间市| 绥芬河市| 乐昌市| 双鸭山市| 静乐县| 郸城县| 清苑县| 旺苍县| 长宁县| 河曲县| 博客| 朝阳市| 金华市| 南昌市| 山东省| 砀山县| 安溪县| 新安县| 济源市| 神池县| 佛学| 西宁市| 上蔡县| 辉南县| 墨脱县| 石狮市| 谢通门县| 资兴市| 阿坝| 德清县| 察雅县| 扎鲁特旗| 囊谦县| 牡丹江市| 陆河县| 当雄县| 桓仁| 台南市| 鸡西市| 东乌珠穆沁旗|