learn-jvm-2-BTrace初探

参考资料

环境准备

计算方法调用过程时间

利用@Duration来获取方法调用时间, 顺便验证Array和HashMap在较少量数据下,哪个容器查找更快.

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class BtraceDuration {
private static final int size = 400;
private static Map<Integer, Integer> map = new HashMap<>();
private static int[] arr = new int[size];
static {
for (int i = 0; i < size; i++) {
map.put(i, i);
arr[i] = i;
}
}
public static boolean findInMap(int v) {
return map.get(v) != null;
}
public static boolean findInArr(int v) {
for (int i : arr) {
if (i == v) return true;
}
return false;
}
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int input;
while (true) {
input = scanner.nextInt(); // 用于阻塞程序,便于观察
findInArr(input);
findInMap(input);
}
}
}

BTrace代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript {
@OnMethod(clazz = "/cn.stq.learn.jvm.btrace\\..*/", method = "/find.*/", location = @Location(Kind.RETURN))
public static void testDuration(@ProbeClassName String pcn,@ProbeMethodName String pmn, @Duration long duration, @Return boolean result) {
// duration 是纳秒,除以1000000得毫秒
print(strcat(pcn,"#"));
print(strcat(pmn, ": "));
print(strcat(str(duration), "ns "));
println(strcat("result->", str(result)));
}
}

结果

Duration


谁调用了这个函数

测试代码

计算方法调用过程时间的测试代码

BTrace代码

1
2
3
4
5
6
7
8
9
10
11
12
13
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript {
@OnMethod(clazz = "/cn.stq.learn.jvm.btrace\\..*/", method = "/find.*/")
public static void testInvokeStack(@ProbeClassName String pcn,@ProbeMethodName String pmn, int param) {
print(strcat(pcn,"#"));
println(strcat(pmn, ""));
println(strcat("param:", str(param)));
jstack(); // 打印调用栈
}
}

结果

invoke stack