我是编程新手,我想教自己一个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();
}

07-24 21:39