【发布时间】:2020-12-26 22:07:23
【问题描述】:
我在实际项目中遇到了 StackOverflowError,并制作了显示问题的简单模型。 它是调用一些递归方法并保存错误深度的测试类。
public class Main {
static int c = 0;
public static void main(String[] args) {
long sum = 0;
int exps = 100;
for (int i = 0; i < exps; ++i) {
c = 0;
try {
simpleRecursion();
} catch (StackOverflowError e) {
sum += c;
}
}
System.out.println("Average method call depth: " + (sum / exps));
}
public static void simpleRecursion() {
simpleMethod();
++c;
simpleRecursion();
}
}
simpleMethod有两个版本:
public static void simpleMethod() {
}
- 它在测试中获得 51K 或 59K 方法调用的深度。
public static void simpleMethod() {
c += 0;
}
- 它在测试中获得 48K 或 58K 方法调用的深度。
为什么这些认识会得到不同的结果?在第二种情况下,我无法理解堆栈中有哪些额外数据。我认为 simpleMethod 不应该影响堆栈内存,因为它不在调用链中。
【问题讨论】:
-
停止递归的条件在哪里?
-
@HoussemBadri 抛出堆栈溢出错误时递归停止。
-
for 循环的意义何在?只是打电话给
simpleRecursion();不足以证明这一点吗? -
@khelwood 是不希望的行为还是实际行为(抛出异常以停止递归的事实)?
-
@HoussemBadri 他们故意造成堆栈溢出以查看堆栈的深度。
标签: java stack-memory