当系统运行后,有的方法的执行时间让人不满意,需要用一些工具去查看执行的情况,可以考虑使用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
where possible options include:
? -classpath Specifywhere to find user class files and annotation processors
? -cp ? ? ? ? Specify where to find user class filesand annotation processors
? -I ? ? ? ? Specify where to find include files
? -p ? ? ? ? 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 = "e