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,因為數組不是存儲在堆棧上而是在堆上。
局部變量占用堆??臻g,但不能聲明這么多局部變量(例如 int i1 = 1; int i2 = 2; ... int i99999 = 99999; ...),因為你被限制為 65536 個字符。
您可以嘗試“手動”調用太多方法,例如 int f1() { return f2(); } int f2(){ return f3();} ... 但這與您已經提到的遞歸基本相同。
打開太多線程也不起作用,因為每個線程都分配了自己的堆棧。你只會像數組一樣得到一個 OutOfMemoryError 。
添加回答
舉報