非常強烈的推薦下BTrace這個工具,用了後不得不說太強大了,BTrace簡單來說,就是能在不改動當前程式的情況下,運行時的去監控Java程式的執行狀況,例如可以做到記憶體狀況的監控、方法調用的監控等等,官方網站上有非常多詳細的例子,我不說太多,只在下面舉一個簡單的例子來說明它的作用,BTrace的User
Guide請見:http://kenai.com/projects/btrace/pages/UserGuide。
對於運行中的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+):
btrace [pid] MethodResponseTime.class
還有例如擷取調用參數、調用者的對象執行個體以及傳回值等請參看User Guide。
btrace為了保持JVM啟動並執行安全性,因此做了很多的限制,例如不能拋出異常、修改傳入的參數的值、修改傳回值等,基本是一個唯讀動態分析代碼健全狀態的工具,但仍然是非常的有用,其實現機制是attach
api + asm + instrumentation。