Java分析栈堆轨迹元素
官方定义:栈堆轨迹是程序执行过程中在某个特定点上所有挂起的方法调用的一个列表。
我的理解:栈堆轨迹就是程序执行过程调用方法的顺序列表和文件名和行数。
有两种方法可以访问栈堆轨迹的文本描述信息
Throwable类
使用Throwable类的printStackTrace()可以访问栈堆轨迹的信息。这个方法也可以打印异常的信息。下面以阶乘的计算作为示例代码。
public static int factorial(int n){
System.out.println("factorial(" + n + "):");
var t = new Throwable();
var out = new StringWriter();
t.printStackTrace(new PrintWriter(out));
String desc = out.toString();
System.out.println(desc);
int r;
if(n <= 1){
r = 1;
} else {
r = n * factorial(n - 1);
}
System.out.println("return " + r);
return r;
}
public static void main(String[] args) {
try(var in = new Scanner(System.in)){
System.out.println("Enter n : ");
int n = in.nextInt();
factorial(n);
}
}
StackWalker类
StankWalker类比起Throwable类的操作更加简单。
public static int factorial(int n){
System.out.println("factorial(" + n + "):");
var walker = StackWalker.getInstance();
walker.forEach(System.out::println);
int r;
if(n <= 1){
r = 1;
} else {
r = n * factorial(n - 1);
}
System.out.println("return " + r);
return r;
}
public static void main(String[] args) {
try(var in = new Scanner(System.in)){
System.out.println("Enter n : ");
int n = in.nextInt();
factorial(n);
}
}