3

私はプログラミングが初めてで、StackOverflow の原因を自分自身に教えようとしています。ループをいじってエラーを引き起こしましたが、テストしたフォークボムのコードではエラーは発生しませんでした。どうしてこれなの?

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"});
    }
  }
}

これにより、スタック オーバーフローは発生しません。なんで?しかし、これは1つを引き起こします:

public class WhileBomb
{
   public WhileBomb()
   {
      while (true)
      {
      new WhileBomb();
      }
   }

   public static void main(String[] args) throws java.io.IOException
   {
     WhileBomb goodBye = new WhileBomb();
   }
}
4

3 に答える 3

11

各スレッドは独自のスタックを取得します。新しいプロセスを作成すると、新しいスレッドと新しいスタックも取得されます。1 つのスタックがいっぱいになると、スタック オーバーフロー エラーが発生しますが、多くの異なるスタックを作成していて、どれもいっぱいになりません。

2 番目の例では、スレッドが 1 つしかなく、再帰呼び出しがあります。メソッドを呼び出すたびに、メソッドが戻るまで、一部の情報が一時的にスタックに格納されます。メソッドが返らないため、スタック オーバーフロー例外が発生するまでスタックが消費されます。

while ループも必要ありません。これにより、スタック オーバーフロー例外も発生します。

public WhileBomb()
{
   new WhileBomb();
}
于 2013-01-15T14:23:16.140 に答える
2

最初の例は、スタックに何も追加していません。まったく新しいスタックを作成しています。ただし、2 番目の例では、次のようにスタックに追加されます。

public WhileBomb()
{
    while (true)
    {
        new WhileBomb();
    }
}

ここに表示されるのは、無限再帰です。オブジェクトの作成には、WhileBombオブジェクトの作成が含まれWhileBombます。これはすべて、同じプログラムの同じスレッドで発生するため (新しいプログラムをフォークするのではなく)、同じスタック内にあります。WhileBombスレッド内でnew が作成されるたびに、それ自体の別のインスタンスがスタックに追加されます。

于 2013-01-15T14:24:10.753 に答える
1

スタック オーバーフローは、利用可能な容量よりも多くのスタック スペースを使用することによって発生します。フォーク爆弾は、多数の新しいプロセスを生成することにより、PC の速度を低下させます。各プロセスはさらに生成し続けます (など)。

フォーク爆弾がスタック オーバーフローを引き起こさない理由は、各プロセスが独自のスタックを持っているためです。そのため、実際にはどのプロセスでも多くのスタック スペースを使用しておらず、それぞれ独自の (比較的小さい) スタックを持つ多くのプロセスを作成するだけです。

于 2013-01-15T14:23:54.363 に答える