非常強烈的推薦下BTrace這個工具,用了后不得不說太強大了,BTrace簡單來說,就是能在不改動當前程序的情況下,運行時的去監控Java程序的
執行狀況,例如可以做到內存狀況的監控、方法調用的監控等等,官方網站上有非常多詳細的例子,我不說太多,只在下面舉一個簡單的例子來說明它的作
用,BTrace的User Guide請見:http://kenai.com/projects/btrace/pages/UserGuide。
對于運行中的Java程序,尤其是出了問題的程序,會需要跟蹤其執行狀況,例如傳入的參數是什么、執行了多少時間,返回的對象是什么,拋出了什么異常,傳 統的做法只能是把程序改一遍,加上一堆log,一個例子來展示下用BTrace的情況下,怎么來跟蹤一個方法的執行時間:
btrace [pid] MethodResponseTime.class
還有例如獲取調用參數、調用者的對象實例以及返回值等請參看User Guide。
btrace為了保持JVM運行的安全性,因此做了很多的限制,例如不能拋出異常、修改傳入的參數的值、修改返回值等,基本是一個只讀的動態分析代碼運行 狀況的工具,但仍然是非常的有用,其實現機制是attach api + asm + ?instrumentation。
對于運行中的Java程序,尤其是出了問題的程序,會需要跟蹤其執行狀況,例如傳入的參數是什么、執行了多少時間,返回的對象是什么,拋出了什么異常,傳 統的做法只能是把程序改一遍,加上一堆log,一個例子來展示下用BTrace的情況下,怎么來跟蹤一個方法的執行時間:
@BTrace?public?class?MethodResponseTime?{
????
????@TLS?private?static?long?startTime;
????
????@OnMethod(clazz="類名",method="方法名")
????public?static?void?onCall(){
????????println("enter?this?method");
????????startTime=timeMillis();
????}
????
????@OnMethod(clazz="類名",method="方法名",location=@Location(Kind.RETURN))
????public?static?void?onReturn(){
????????println("method?end!");
????????println(strcat("Time?taken?ms",str(timeMillis()-startTime)));
????}
????
}
用btrace執行上面的代碼,就可以動態的監控任意的目前運行的Java程序中某類的某方法的執行時間,執行上面代碼的方式如下(jdk 6+):????
????@TLS?private?static?long?startTime;
????
????@OnMethod(clazz="類名",method="方法名")
????public?static?void?onCall(){
????????println("enter?this?method");
????????startTime=timeMillis();
????}
????
????@OnMethod(clazz="類名",method="方法名",location=@Location(Kind.RETURN))
????public?static?void?onReturn(){
????????println("method?end!");
????????println(strcat("Time?taken?ms",str(timeMillis()-startTime)));
????}
????
}
btrace [pid] MethodResponseTime.class
還有例如獲取調用參數、調用者的對象實例以及返回值等請參看User Guide。
btrace為了保持JVM運行的安全性,因此做了很多的限制,例如不能拋出異常、修改傳入的參數的值、修改返回值等,基本是一個只讀的動態分析代碼運行 狀況的工具,但仍然是非常的有用,其實現機制是attach api + asm + ?instrumentation。