我是编程新手,我想教自己一个StackOverflow是由什么引起的。我玩了循环并导致了错误,但是我测试过的forkbomb的代码并没有导致错误。为什么是这样?
public class ForkBomb
{
public static void main(String[] args) throws java.io.IOException
{
while(true)
{
Runtime.getRuntime().exec(new String[]{"java", "-cp", System.getProperty("java.class.path"), "ForkBomb"});
}
}
}
这不会导致堆栈溢出。为什么?然而,这导致了:
public class WhileBomb
{
public WhileBomb()
{
while (true)
{
new WhileBomb();
}
}
public static void main(String[] args) throws java.io.IOException
{
WhileBomb goodBye = new WhileBomb();
}
}
最佳答案
每个线程都有自己的堆栈。创建新进程时,您还将获得一个新线程和一个新堆栈。当单个堆栈已装满但您正在创建许多不同的堆栈时,都不会发生堆栈溢出错误。
在第二个示例中,您只有一个线程,并且有一个递归调用。每次调用一个方法时,一些信息都会临时存储在堆栈中,直到该方法返回为止。因为您的方法从不返回,所以堆栈将被消耗,直到您收到堆栈溢出异常为止。
您甚至不需要while循环。这也会产生堆栈溢出异常:
public WhileBomb()
{
new WhileBomb();
}