無線&移動互聯網技術研發

          換位思考·····
          posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Java代碼觸發生成ThreadDump

          Posted on 2009-11-30 23:13 Gavin.lee 閱讀(589) 評論(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()
                    返回表示該堆棧跟蹤元素的字符串。
           
          主站蜘蛛池模板: 福安市| 隆昌县| 喜德县| 绵阳市| 海淀区| 原平市| 红桥区| 个旧市| 漳平市| 昌吉市| 桂林市| 泾阳县| 株洲县| 镇巴县| 商南县| 宣城市| 高邮市| 廉江市| 卓尼县| 建宁县| 凤凰县| 龙江县| 西乡县| 泗水县| 五河县| 高阳县| 静乐县| 色达县| 嵩明县| 宜州市| 怀宁县| 澳门| 南漳县| 甘肃省| 成武县| 阿拉尔市| 旬邑县| 吉林市| 昭觉县| 甘肃省| 芮城县|