2 回答
TA贡献1802条经验 获得超10个赞
这是抛出 StackOverflowError 的另一种方法,而不会溢出堆栈:
int f()
{
throw new StackOverflowError();
}
另一种方法是让一个方法调用另一个方法,调用那个方法下面会产生一个 StackOverflowError:
public static void main(String[] args)
{
testMethod();
}
public static void testMethod()
{
testMethod2();
}
public static void testMethod2()
{
testMethod();
}
从理论上讲,您可以减少堆栈大小(例如-Xss1k)并尝试通过声明太多原始变量来溢出堆栈。
但是我可以设置的最小堆栈大小是 70k。否则我会收到错误消息The stack size specified is too small, Specify at least 108k(不过,错误不会出现在 80k - 107k+ 之间)
TA贡献1821条经验 获得超6个赞
如果递归深度足够大(或足够深?),任何递归方法都会产生溢出错误。你的方法是一个完美的例子,因为它会产生无限的深度。
我知道没有其他方法不包括递归,这实际上是可能的。
如果你声明一个太大的数组,你会得到一个 OutOfMemoryError,因为数组不是存储在堆栈上而是在堆上。
局部变量占用堆栈空间,但不能声明这么多局部变量(例如 int i1 = 1; int i2 = 2; ... int i99999 = 99999; ...),因为你被限制为 65536 个字符。
您可以尝试“手动”调用太多方法,例如 int f1() { return f2(); } int f2(){ return f3();} ... 但这与您已经提到的递归基本相同。
打开太多线程也不起作用,因为每个线程都分配了自己的堆栈。你只会像数组一样得到一个 OutOfMemoryError 。
添加回答
举报