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

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

          Posted on 2009-11-30 23:13 Gavin.lee 閱讀(594) 評(píng)論(0)  編輯  收藏 所屬分類: java SE & EE
          ThreadDump對(duì)于JVM診斷和調(diào)優(yōu)是個(gè)好東西. 以前, 我們生成ThreadDump, 一般都需要另外連到服務(wù)器上的進(jìn)程管理器才行, 不管是Ctrl+Break還是kill –3, 比較不方便. 有時(shí)候, 也許想遠(yuǎn)程直接生成并檢查一下服務(wù)器的ThreadDump, 這個(gè)怎么辦呢? 幸好我們有以下代碼可以做到:
          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/>");
                  }

              }


          }


          然后在一個(gè)JSP里或者Servlet中任意調(diào)用即可:
          
          <%=new ThreadDumpBuilder().build() %>
          
          ===== END OF THREAD DUMP ===============
          
          參考資料:
          1. Atlassian Confluence 3.0 管理控制臺(tái)
          2. JDK的DEMO
          jdk1.5.0\demo\management\FullThreadDump
          原文:http://ajava.org/course/java/13843.html 
          java.lang
          類 StackTraceElement 方法:
           boolean  equals(Object obj)
                    如果指定的對(duì)象是另一個(gè) StackTraceElement 實(shí)例,并且該對(duì)象表示的執(zhí)行點(diǎn)與該實(shí)例的相同,則返回 ture。
           String  getClassName()
                    返回類的完全限定名,該類包含由該堆棧跟蹤元素所表示的執(zhí)行點(diǎn)。
           String  getFileName()
                    返回源文件名,該文件包含由該堆棧跟蹤元素所表示的執(zhí)行點(diǎn)。
           int  getLineNumber()
                    返回源行的行號(hào),該行包含由該堆棧該跟蹤元素所表示的執(zhí)行點(diǎn)。
           String  getMethodName()
                    返回方法名,此方法包含由該堆棧跟蹤元素所表示的執(zhí)行點(diǎn)。
           int  hashCode()
                    返回此堆棧跟蹤元素的哈希碼值。
           boolean  isNativeMethod()
                    如果包含由該堆棧跟蹤元素所表示的執(zhí)行點(diǎn)的方法是一個(gè)本機(jī)方法,則返回 true。
           String  toString()
                    返回表示該堆棧跟蹤元素的字符串。
           
          主站蜘蛛池模板: 嫩江县| 镇宁| 龙海市| 新龙县| 康保县| 岐山县| 阳泉市| 黎城县| 天台县| 揭阳市| 米泉市| 元氏县| 辽宁省| 清镇市| 西城区| 图片| 维西| 墨竹工卡县| 商洛市| 高邑县| 会泽县| 达州市| 泗阳县| 旅游| 康定县| 海城市| 宁陕县| 井冈山市| 库车县| 仪征市| 略阳县| 和林格尔县| 湟中县| 集贤县| 平乐县| 永胜县| 华蓥市| 海晏县| 安宁市| 花莲县| 兴和县|