當系統運行後,有的方法的執行時間讓人不滿意,需要用一些工具去查看執行的情況,可以考慮使用Btrace,使用還是比較簡單的。
1、安裝
首先到網上下個Btrace包吧,官方網址是:http://kenai.com/projects/btrace
解壓後,把bin目錄加入到環境變量中就可以使用了。
2、驗證
配置環境變量後,打開一個CMD控制台:
輸入命令 btrace:
Microsoft Windows [版本 6.1.7601]
版權所有 (c) 2009 MicrosoftCorporation。保留所有權利。
C:\Users\fan>btrace
Usage: btrace <options> <pid> <btrace source or .classfile> <btrace arguments>
where possible options include:
-classpath <path> Specifywhere to find user class files and annotation processors
-cp <path> Specify where to find user class filesand annotation processors
-I <path> Specify where to find include files
-p <port> Specify port to which the btrace agentlistens for clients
配置就完成了。
3、開發
btrace安裝好了,可以到btrace的官方幫助文檔中去看語法http://kenai.com/projects/btrace/pages/UserGuide
寫btrace腳本和一般的java差別不大,只是用了一些annotation來標識某個類是跟蹤腳本。btrace用到的jar包基本都在下載的/btrace-bin/build文件下,將這三個包導進工程就可以使用了。【btrace腳本寫好後可以不用編譯,直接執行.java文件就可以】
看一個trace的例子。
package com.btrace;
import java.util.Random;
import java.util.Arrays;
/**
* 簡單的Btrace查看的示例,主要是方法的運行時間和內存使用
* @author 范芳銘
*/
public class EasyBtraceTest {
private Object[] elements;
private int size = 0;
private static final intDEFAULT_INI_CAPACITY = 16;
public byte[] placeHolder =new byte[64 * 1024]; //占位符
public EasyBtraceTest(){
elements = new Object[DEFAULT_INI_CAPACITY];
}
public static voidmain(String[] args) throws Exception {
while (true) {
Random random =new Random();
execute(random.nextInt(4000));
}
}
public static Integerexecute(int sleepTime) {
try {
Thread.sleep(sleepTime);
if (sleepTime %2 == 0){
System.out.println("正在執行");
EasyBtraceTesttest = new EasyBtraceTest();
test.push(test);
}
} catch (Exception e) {
}
System.out.println("sleeptime is=>" + sleepTime);
return 0;
}
//用於占用內存
public void push(Object e){
if (elements.length ==size )
elements=Arrays.copyOf(elements, 2 * size + 1 );
elements[size++] = e;
}
}
4、btrace腳本
我要監控execute方法執行的時間,以及使用的內存的情況
btrace腳本如下:
package com.btrace;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.str;
import static com.sun.btrace.BTraceUtils.strcat;
import static com.sun.btrace.BTraceUtils.timeMillis;
import com.sun.btrace.BTraceUtils.Sys;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.OnTimer;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
import com.sun.btrace.annotations.TLS;
@BTrace
public class TraceEasyBtrace {
@TLS
private static long startTime =0;
@OnMethod(clazz ="com.btrace.EasyBtraceTest", method = "execute")
public static voidstartMethod(){
startTime =timeMillis();
}
@OnMethod(clazz ="com.btrace.EasyBtraceTest", method = "execute", location =@Location(Kind.RETURN))
public static voidendMethod(){
println(strcat("theclass method execute time=>", str(timeMillis()-startTime)));
println("-------------------------------------------");
}
@OnMethod(clazz ="com.btrace.EasyBtraceTest", method = "execute", location =@Location(Kind.RETURN))
public static voidtraceExecute(@ProbeClassName String name,@ProbeMethodName String method,intsleepTime){
println(strcat("theclass name=>", name));
println(strcat("the classmethod=>", method));
println(strcat("theclass method params=>", str(sleepTime)));
}
@OnTimer(4000)
public static void printMem() {
println("Heap:");
println(Sys.Memory.heapUsage());
println("Non-Heap:");
println(Sys.Memory.nonHeapUsage());
}
}
上面源碼有幾點注意的:
1、 @BTrace 這個annotation表明這個類是btrace腳本,
2、@OnMethod(clazz = " com.btrace.EasyBtraceTest ",method = "execute")
中clazz標明要監控那個類,也可以用正則匹配的方式,method標明要監控類的哪個方法
5、運行和具體使用
代碼寫好了,將EasyBtraceTest程序跑起來,看到每個幾秒控制台就會有信息輸出:
sleep time is=>3774
sleep time is=>1883
sleep time is=>3863
….
說明程序已經在跑了。
用TraceEasyBtrace.java這個腳本來監控EasyBtraceTest
前提條件:
兩個目錄:
TraceEasyBtrace.java 所在的目錄,在D:\develop\eclipse\work\performance\src\com\btrace下
JAVA的bin目錄下,用JPS查看進程id(應用每次運行可能都會變動,要在本機運行)
我的目錄在:
C:\Users\fan>cd C:\Program Files\Java\jdk1.6.0_25\bin
獲得運行的JAVA的進程ID;
進入命令行:
Microsoft Windows [版本 6.1.7601]
版權所有 (c) 2009 MicrosoftCorporation。保留所有權利。
C:\Users\fan>cd C:\Program Files\Java\jdk1.6.0_25\bin
C:\Program Files\Java\jdk1.6.0_25\bin>jps
7364 EasyBtraceTest
2268
5392
6816 Jps
C:\Program Files\Java\jdk1.6.0_25\bin>
其中,7364 EasyBtraceTest 就是我們這個應用的PID。
這時候在TraceEasyBtrace.java 所在的目錄下運行命令btrace 7364 TraceEasyBtrace.java,結果如下:
Microsoft Windows [版本 6.1.7601]
版權所有 (c) 2009 MicrosoftCorporation。保留所有權利。
C:\Users\fan>cd C:\Program Files\Java\jdk1.6.0_25\bin
C:\Program Files\Java\jdk1.6.0_25\bin>jps
7364 EasyBtraceTest
2268
5392
6816 Jps
C:\Program Files\Java\jdk1.6.0_25\bin>d:
D:\>cd D:\develop\eclipse\work\performance\src\com\btrace
D:\develop\eclipse\work\performance\src\com\btrace>btrace 7364TraceEasyBtrace.java
Heap:
init = 0(0K) used = 1005544(981K) committed = 5177344(5056K) max =66650112(65088K)
Non-Heap:
init = 12746752(12448K) used = 5666640(5533K) committed = 13303808(12992K)max = 100663296(98304K)
the class name=>com.btrace.EasyBtraceTest
the class method=>execute
the class method params=>3011
the class method execute time=>3012
-------------------------------------------
the class name=>com.btrace.EasyBtraceTest
the class method=>execute
the class method params=>2849
the class method execute time=>2850
…
可以看到每當execute方法執行時,就會打印出一行信息。打印出了類名,方法名,參數,以及這個方法執行的時間。以及內存的使用情況;
這就是一個非常簡單的btrace監控,還可以用於數據庫執行語句的監控,多線程的監控,WebService的監控等。