您的位置:首页 > 其它

【性能跟踪】btrace学习二--btrace一个简单例子

2010-12-21 21:58 351 查看
btrace安装好了,就看一些语法吧。可以到btrace的官方帮助文档中去看,基本上就可以http://kenai.com/projects/btrace/pages/UserGuide

【注:你本地的jdk要是1.6及以上才行,1.5可是不支持的】

下面以一个例子来说明:

新建了一个工程,目录结构如下:



写btrace脚本和一般的java差别不大,只是用了一些annotation来标识某个类是跟踪脚本。btrace用到的jar包基本都在下载的/btrace-bin/build文件下,将这三个包导进工程就可以使用了。【btrace脚本写好后可以不用编译,直接执行.java文件就可以】

看一个trace helloworld的例子。

我的helloworld文件在com.app.test包下,源码为:

package my.app.test;

import java.util.Random;

public class HelloWorld {
public static void main(String[] args) throws Exception {
//CaseObject object = new CaseObject();
while (true) {
Random random = new Random();
execute(random.nextInt(4000));

//object.execute(random.nextInt(4000));
}

}
public static Integer execute(int sleepTime) {
try {
Thread.sleep(sleepTime);
} catch (Exception e) {
}
System.out.println("sleep time is=>"+sleepTime);
return 0;
}
}


这时候我要监控execute方法执行的时间,

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.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.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
import com.sun.btrace.annotations.TLS;
@BTrace
public class TraceHelloWorld {

@TLS
private static long startTime = 0;

@OnMethod(clazz = "my.app.test.HelloWorld", method = "execute")
public static void startMethod(){
startTime = timeMillis();
}

@OnMethod(clazz = "my.app.test.HelloWorld", method = "execute", location = @Location(Kind.RETURN))
public static void endMethod(){
println(strcat("the class method execute time=>", str(timeMillis()-startTime)));
println("-------------------------------------------");
}

@OnMethod(clazz = "my.app.test.HelloWorld", method = "execute", location = @Location(Kind.RETURN))
public static void traceExecute(@ProbeClassName String name,@ProbeMethodName String method,int sleepTime){
println(strcat("the class name=>", name));
println(strcat("the class method=>", method));
println(strcat("the class method params=>", str(sleepTime)));

}
}


上面源码有几点注意的:

1、import里面引入了BTraceUtils很多的静态方法,也可以直接全部倒入

2、 @BTrace 这个annotation表明这个类是btrace脚本,

3、@OnMethod(clazz = "my.app.test.HelloWorld", method = "execute")

中clazz标明要监控那个类,也可以用正则匹配的方式,method标明要监控类的哪个方法

4、其中用到的几个方法timeMillis(),获取时间,println(str)输出

ok,上面代码写好了,将helloworld程序跑起来,看到每个几秒控制台就会有信息输出:

sleep time is=>558
sleep: 2243
-----
sleep time is=>3408
sleep: 2205
-----
sleep time is=>2981
sleep: 1788
-----
sleep time is=>2052
sleep: 3527
-----
sleep time is=>2407
sleep: 3157
-----


说明程序已经在跑了。

这时候就可以用traceHelloworld.java 这个脚本来监控了

进入命令行:

进入到traceHelloworld.java 所在的目录,现在我的脚本是在D:/workspace/btrace/src 下

用jps 看看我的helloworld程序的pid是什么,如下:



我的helloworld程序的pid是6140,

这时候运行一个命令btrace 6140 TraceHelloWorld.java 就可以了,结果如下:



可以看到每当helloworld里德execute方法执行时,就会打印出一行信息。打印出了类名,方法名,参数,以及这个方法执行的时间

ok了,这就是一个最简单的btrace监控了,还有一些复杂的用法,后面再写。也可以到官方网站上看看。很简单的,但是很有用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: