<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 42,comments - 83,trackbacks - 0
          JPDA(Java Platform Debugger Architecture)是sun推出的一套工具接口,有了這些接口,debugger、profile工具可以attach到target JVM,進而可以監控、調試我們的程序。JPDA包括三部分:JVM TI, JDI, JDWP。TI可以使用native語言,通過調用jvmti.c提供的系列庫函數,實現debug工作,而JDI是TI面向Java開發人員提供的高層開發接口。TI代替了早期的DI,每個版本都做了一定的功能增強。隨著JDK的發展,JPDA變得越發強大,比如thread信息檢查、method調用跟蹤、memory walk-through、perm內存區檢查等,有了這些接口,我們完全可以自己造出類似于:jhat、jmap、jstack、jconsole這樣的車子。用一句過時話來說:JPDA,很好很強大。

            在Weblogic中,我們通常能看到像下面這樣的警告信息:
    BEA-000337 Feb 1, 2007 11:01:05 AM EST Error WebLogicServer ExecuteThread: '14' for queue: 'weblogic.kernel.Default' has been busy for "72" seconds working on the request "connection82.session95", which is more than the configured time (StuckThreadMaxTime) of "60" seconds.

             這樣的信息只是一個提示,告訴最終用戶某個執行線程執行了多長時間(只有執行時間超過StuckThread-MaxTime,默認600秒),用戶可以根據這些信息,分析對應的請求執行了這么長時間是否正常,如果在預期或可以接受范圍內,不用作任何干預,否則我們需要借助于thread dump分析執行時間的瓶頸。出現這樣的警告信息,weblogic不會對這樣的線程作任何操作(weblogic無法識別這么長的執行時間是不是用戶所預期的,比如報表操作、文件傳輸等本身可能就很耗時),直到線程結束。線程能執行結束還好,如果是死鎖呢? 這樣的線程會一直被掛著,直到weblogic重啟。重啟對于很多生產系統而言是最后的選擇,那么我們有什么方法來避免重啟呢? Weblogic9以后,線程管理方面work manager代替了早期的thread pool,而且work manager提供了stuck thread的管理,比如出現幾個stuck thread后,我們可以要求work manager停止應用,避免更多的線程被stuck。weblogic停止應用只是不提供服務,但還是不會影響正在執行的線程。

             曾經不止一次的被客戶問道我們能否中斷這樣的線程,從weblogic層面來看,這是mission impossible。現在有了TI,我們可以通過它中斷這樣的線程。

              要中斷這樣的線程,首先要借助thread dump拿到線程名,我們將以線程名為filter。Thread dump信息如下:

    "[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=6 tid=0x2b25a800 nid=0x3c0 waiting on condition [0x2e08f000..0x2e08fa14]
     java.lang.Thread.State: TIMED_WAITING (sleeping)
          at java.lang.Thread.sleep(Native Method)
          ......
    上面這個線程的名字就是:[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'

             為了能正確的attach上JVM,啟動的時候需要加上如下的JAVA_OPTIONS,
             -Xdebug -Xrunjdwp:transport=dt_socket,address=9191,server=y,suspend=n

             現在我們就可以下面的方法attach到target JVM,
     1     private VirtualMachine connectVM(){
     2             VirtualMachineManager vmm = Bootstrap.virtualMachineManager();
     3             List connectors = vmm.attachingConnectors();
     4             Connector conn = null;
     5             AttachingConnector socketAttachingConnector = null
     6             /*
     7             * host and port should be set here
     8             */
     9             .
    10       try{
    11           vm = socketAttachingConnector.attach(arguments);
    12       }catch(Exception e){
    13           e.printStackTrace();
    14       }
    15       return this.vm;
    16     }

            有了線程名、connection,我們就可以用下面的方法去中斷掛死線程了,
     1     public void terminateThread(String threadPattern){
     2         if(vm != null){
     3             List threads = vm.allThreads();
     4             ThreadReference tr = null;
     5             int loop = -1;
     6             for(loop=0; loop<threads.size(); loop++){
     7                 if(tr.toString().indexOf(threadPattern) != -1){
     8                     tr.interrupt();
     9                     System.out.println(threadPattern + " is terminated!");
    10                     break;
    11                 }
    12             }
    13             if(loop == threads.size())
    14                 System.out.println("no matched thread was found in target VM!");
    15         }
    16     }
            
            線程被中斷的時候,會收到InterruptedExcetpion,比如我在測試中讓線程sleep,然后利用上面的程序去中斷sleep,收到的異常如下:

    java.lang.InterruptedException: sleep interrupted
            at java.lang.Thread.sleep(Native Method)
            at test.jpda.clazz.Test2.run(Test2.java:14)
            at test.jpda.clazz.Test1.run(Test1.java:10)
            at test.jpda.clazz.Test.run(Test.java:9)
            at jsp_servlet.__index._jspService(__index.java:91)
            at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
            at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
            at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
            at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.ru(WebAppServletContext.java:3498)
            at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
            at weblogic.security.service.SecurityManager.runAs(Unknown Source)
            at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
            at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
            at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
            at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
            at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)       


    注意:線程名一定不能寫錯啊,否則就可能誤殺了,老板批你別怨俺。

    posted on 2009-09-10 15:18 走走停停又三年 閱讀(5989) 評論(6)  編輯  收藏 所屬分類: Java Technology

    FeedBack:
    # re: JVM TI學習(1)----如何中斷weblogic中stuck thread
    2009-09-09 12:37 | Ken Wu
    你這類應用其實還不算是TI的應用范疇。
    真正的TI,是需要在vm啟動階段就植入的。  回復  更多評論
      
    # re: JVM TI學習(1)----如何中斷weblogic中stuck thread
    2009-09-09 13:01 | 走走停停又三年
    你手里有TI的例子嗎?我對這塊比較感興趣,如果有能否共享一下? 你說的是agent吧,我這里用的是JDI,TI的Java接口。

    Tools can be written directly to JVM TI or indirectly through higher level interfaces. The Java Platform Debugger Architecture includes JVM TI, but also contains higher-level, out-of-process debugger interfaces. The higher-level interfaces are more appropriate than JVM TI for many tools. For more information on the Java Platform Debugger Architecture, see the Java Platform Debugger Architecture website.

    參考這個鏈接:http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html  回復  更多評論
      
    # re: JVM TI學習(1)----如何中斷weblogic中stuck thread
    2009-09-09 14:24 | JBahamut
    tr.interrupt()
    這個效果應該和Thread.interrupt一樣吧,線程并沒有被終止  回復  更多評論
      
    # re: JVM TI學習(1)----如何中斷weblogic中stuck thread
    2009-09-09 14:45 | 走走停停又三年
    對,線程不會被結束,等同于thread.interrupt()  回復  更多評論
      
    # re: JVM TI學習(1)----如何中斷weblogic中stuck thread
    2009-09-10 23:25 | Ken Wu
    @走走停停又三年
    你的文檔是對的,真正的TI一般用C++寫的,植入第三方agent libraries。
    比如替換Object.class之類的操作,如果你用instrumentation就實現不了。  回復  更多評論
      
    # re: JVM TI學習(1)----如何中斷weblogic中stuck thread
    2009-09-11 09:01 | 走走停停又三年
    不要太拘泥于定義。所謂TI,說白了就是工具接口,沒必要把要什么語言定義死吧,要這個語言寫就是,換個語言寫就不是。也許你是對的,TI用c或c++寫,而JDI,其實就是TI的高層接口,對于Java程序員更為適用。兩者的功能區別有多大? 他們的功能都依賴于JVM開放函數,即jmvti.h中的函數。你用TI要限于這些函數,而JDI就是對這些函數的封裝,我不覺得會少多少東西。至少我們常用的:heap遍歷、class裝載、卸載監聽、方法調用監聽、鎖等待監聽等一一都有。至于類動態更新,你可以看看:http://www.tkk7.com/fjin/archive/2009/09/11/294634.html  回復  更多評論
      
    主站蜘蛛池模板: 中文字幕在线观看亚洲| 久久伊人亚洲AV无码网站| 亚洲国产精品久久66| 今天免费中文字幕视频| 亚洲精品乱码久久久久久蜜桃不卡| 日韩在线观看视频免费| 亚洲精品偷拍视频免费观看 | 亚洲色图校园春色| 99在线观看视频免费| 1区1区3区4区产品亚洲| 1区2区3区产品乱码免费| 亚洲AV无码成人专区| 狼友av永久网站免费观看| 处破女第一次亚洲18分钟| 亚洲精品成人久久久| jizz在线免费播放| 亚洲国产精品成人精品无码区在线| 在线人成免费视频69国产| 老司机亚洲精品影院无码| 日韩欧毛片免费视频| 国产亚洲精品VA片在线播放| 免费的涩涩视频在线播放| 美女视频黄频a免费观看| 亚洲欧洲国产精品香蕉网| 国产成人精品免费久久久久| 亚洲欧洲国产综合| 国产在线98福利播放视频免费| free哆拍拍免费永久视频| 亚洲一区二区三区日本久久九 | 国产精品免费播放| A级毛片成人网站免费看| 久久av无码专区亚洲av桃花岛| 成人免费看片又大又黄| 老司机精品免费视频| 亚洲综合久久1区2区3区| 日韩精品视频免费观看| 91视频精品全国免费观看| 亚洲伊人久久大香线蕉在观 | 亚洲中文字幕无码不卡电影| 在线观看免费av网站| 国产精品亚洲二区在线|