使用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

上一篇:Mac中使用svn进行项目管理


下一篇:2021-12-13每日一题