首页 > 代码库 > 使用btrace来找出执行慢的方法

使用btrace来找出执行慢的方法

转载于:https://shaojun.name/2016/07/260

btrace script

import static com.sun.btrace.BTraceUtils.name;
import static com.sun.btrace.BTraceUtils.print;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.probeClass;
import static com.sun.btrace.BTraceUtils.probeMethod;
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.TLS;
 
@BTrace
public class MethodTimeCost {
 
    @TLS private static long starttime;
     
    @OnMethod(clazz="/org\\..*/", method="/.+/",location=@Location(Kind.ENTRY))
    public static void startExecute() {
        starttime = timeMillis();
    }
     
    @OnMethod(clazz="/org\\..*/", method="/.+/",location=@Location(Kind.RETURN))
    public static void endExecute() {
        long timecost = timeMillis() - starttime;
        if(timecost > 50) {
            print(strcat(strcat(name(probeClass()), "."), probeMethod()));
            print("  [");
            print(strcat("Time taken : ", str(timecost)));
            println("]");
        }
    }
}

被测试代码:

package org.shaojun.test;
 
public class MyTest {
 
    public static void main(String[] args) {
         
         
        for(int i = 0;i < 100; i++) {
            Thread t = new Thread() {
                @Override
                public void run() {
                    Slow slow = new Slow();
                    slow.query();
                }
            };
            t.start();
        }
    }
}
 
package org.shaojun.test;
 
public class Slow {
 
    public void query() {
        while(true) {
            slow();
        }
    }
     
    public void slow() {
        slow2();
    }
     
    public void slow2() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("helloworld");
    }
}

执行以下代码:
/btrace -cp build 2042 /Users/shaojun/Documents/workspace/btrace/src/MethodTimeCost.java
其中,2042是被测试代码的java进程id
/Users/shaojun/Documents/workspace/btrace/src/MethodTimeCost.java是btrace脚本所在位置
-cp build可以沿用

以下是btrace下载地址:
btrace-bin-1.3.7

使用btrace来找出执行慢的方法