`
阿尔萨斯
  • 浏览: 4181525 次
社区版块
存档分类
最新评论

性能跟踪利器——Btrace

 
阅读更多

Btrace是由Kenai开发的一个开源项目,是一种动态跟踪分析JAVA源代码的工具。它使用OjbectWeb ASM组件来完成字节码层面上的跟踪分析,帮助我们对运行时的JAVA程序分析,监控等操作


优点:

》无侵入性(只查看,不会修改)

》不修改应用任何应用数据

》限制跟踪行为,没能有循环


一、 Btrace 原理:


本地编写跟踪类,由Btrace 命令行执行即可。

1、本地编译跟踪类。

2、attach远程JVM PID,将class传过去。

3、通过脚本引擎及asm动态变更JVM中的字节码,将跟踪代码嵌入。

4、代码触发后,将结果返回本地输出。


二、安装步骤


1、首先下载Btrace包。我下载的是最新版本1.2.2,下载地址:http://kenai.com/projects/btrace/downloads/directory/releases/release-1.2.2

有多个版本供你选择(window、Linux 、MacOS)。本文以windows为例。

下载后得到的是一个btrace-bin.zip 压缩包。将其解压(注:目录里面最好不要有空格)

2、配置环境变量

在环境变量中配置BTRACE_HOME。在PATH中添加BIN目录的路径

BTRACE_HOME =D:\software\btrace-bin

path=$path$;D:\software\btrace-bin\bin


三、使用步骤

1、运行要测试的web程序,或者是运行java程序的 main函数
2、用jps获取当前进程pid
3、运行监控脚本,查看特定类的运行状况。
命令格式:btrace <pid> 脚本程序.java,


四、例子

1.、业务代码

Count.java

package test.btrace;

/**
 * 类Counter.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-11-3 下午12:33:56
 */
public class Counter {

    // 总数
    private static int totalCount = 0;

    public int add(int num) throws Exception {
        totalCount += num;
        return totalCount;
    }

    public int getNum() {
        return totalCount;
    }

}

CountMainTest.java

package test.btrace;

import java.util.Random;

/**
 * 类CountMainTest.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-11-3 下午12:34:35
 */
public class CountMainTest {

    public static void main(String[] args) throws Exception {
        Random random = new Random();

        // 计数器
        Counter counter = new Counter();
        while (true) {
            // 每次增加随机值
            counter.add(random.nextInt(100));
            System.out.println(counter.getNum());
            System.out.println("--------------------------");
            Thread.sleep(1000);
        }
    }

}

2、btrace脚本

package test.btrace;

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

/**
 * 类TraceTest.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-11-3 下午12:35:28
 */
@BTrace
public class TraceTest {

    @TLS
    private static long startTime = 0;

    /**
     * 开始时间
     */
    @OnMethod(clazz = "test.btrace.Counter", method = "add")
    public static void startMethod() {
        startTime = timeMillis();
    }

    /**
     * 结束时间
     */
    @OnMethod(clazz = "test.btrace.Counter", method = "add", location = @Location(Kind.RETURN))
    public static void endMethod() {
        println(strcat("the class method execute time=>", str(timeMillis() - startTime)));
        println("-------------------------------------------");
    }

    /**
     * 跟踪方法执行过程
     * 
     * @param num
     * @param result
     */
    @OnMethod(clazz = "test.btrace.Counter", method = "add", location = @Location(Kind.RETURN))
    public static void traceExecute(int num, @Return int result) {
        println(strcat("parameter num: ", str(num)));
        println(strcat("return value:", str(result)));
    }
}

3.首先运行业务类,CountMainTest.java

然后进入btrace脚本类目录D:\alibaba\application\work\memcached\src\test\btrace,执行脚本命令

控制台输出:



源代码:https://mymemcached-cookie.googlecode.com/svn/trunk

参考资料:http://mgoann.iteye.com/blog/1409667


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics