故意使stackoverflow

时间:2018-09-19 14:55:39

标签: java stack stack-overflow

以下代码会引起stackoverflow错误:

int f(){  
    return f();  
}

但是还有其他方法可以使stackoverflow错误吗?
(提前感谢)

2 个答案:

答案 0 :(得分:2)

这是引发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 +之间不会出现错误)

答案 1 :(得分:0)

如果递归深度足够大(或很深?),则任何递归方法都将产生溢出错误。您的方法是一个完美的例子,因为它将产生无限的深度。

我知道,没有其他方法不包括递归,这实际上是可行的。

如果声明的数组太大,则会收到OutOfMemoryError,因为该数组不是存储在堆栈中,而是存储在堆中。

局部变量占用堆栈空间,但是您不能声明那么多局部变量(例如int i1 = 1; int i2 = 2; ... int i99999 = 99999; ...),因为您的字符数限制为65536个。

您可以尝试“手动”调用太多方法,例如int f1(){return f2(); } int f2(){return f3();} ...但这与您已经提到的递归基本上相同。

打开太多线程也不起作用,因为每个线程都被分配了自己的堆栈。您只会收到与数组类似的OutOfMemoryError。